Ignore:
Timestamp:
10/10/23 12:58:04 (7 months ago)
Author:
omamce
Message:

O.M. :

New version of WATER_BUDGET

  • Conservation in NEMO are OK
  • Conservation in Sechiba are OK, for both ICO and latlon grids
  • Problems in atmosphere, LIC surface and ocean/atmosphere coherence
File:
1 edited

Legend:

Unmodified
Added
Removed
  • TOOLS/WATER_BUDGET/CPL_waterbudget.py

    r6508 r6647  
    1212## 
    1313## 
    14 ## SVN information 
     14# SVN information 
    1515#  $Author$ 
    1616#  $Date$ 
     
    1919#  $HeadURL$ 
    2020 
    21  
     21# SVN Information 
     22SVN = { 
     23    'Author'  : "$Author$", 
     24    'Date'    : "$Date$", 
     25    'Revision': "$Revision$", 
     26    'Id'      : "$Id$", 
     27    'HeadURL' : "$HeadUrl:  $" 
     28    } 
    2229### 
    2330## Import system modules 
     
    2734from pathlib import Path 
    2835 
     36### 
     37## Import system modules 
     38import sys, os, shutil#, subprocess, platform 
     39import configparser, re 
     40 
     41## Import needed scientific modules 
     42import numpy as np, xarray as xr 
     43 
    2944# Check python version 
    3045if sys.version_info < (3, 8, 0) : 
     
    3247    raise Exception ( "Minimum Python version is 3.8" ) 
    3348 
    34 ## Import local module 
     49## Import local modules 
    3550import WaterUtils as wu 
     51import libIGCM_sys 
     52import nemo, lmdz 
     53 
     54from WaterUtils import VarInt, Rho, Ra, Grav, ICE_rho_ice, ICE_rho_sno, OCE_rho_liq, ATM_rho, SRF_rho, RUN_rho, ICE_rho_pnd, YearLength 
    3655 
    3756## Creates parser for reading .ini input file 
    38 config = configparser.ConfigParser (interpolation=configparser.ExtendedInterpolation() ) 
     57## ------------------------------------------- 
     58config = configparser.ConfigParser ( interpolation=configparser.ExtendedInterpolation() ) 
    3959config.optionxform = str # To keep capitals 
    4060 
    4161## Experiment parameters 
    42 ATM=None ; ATM_HIS='latlon' ; SRF_HIS='latlon' ; ORCA=None ; NEMO=None ; OCE_relax=False ; OCE_icb=False ; Coupled=False ; Routing=None ;  TarRestartPeriod_beg=None ; TarRestartPeriod_end=None ; Comment=None ; Period=None ; Title=None 
     62## --------------------- 
     63ATM=None ; ATM_HIS='latlon' ; SRF_HIS='latlon' ; RUN_HIS='latlon' ; ORCA=None ; NEMO=None ; OCE_relax=False 
     64OCE_icb=False ; Coupled=False ; Routing=None ; TestInterp=None 
     65TarRestartPeriod_beg=None ; TarRestartPeriod_end=None ; Comment=None ; Period=None ; Title=None 
     66YearBegin=None ; YearEnd=None ; DateBegin=None ; DateEnd=None 
    4367 
    4468## 
    45 ARCHIVE=None ; STORAGE=None ; SCRATCHDIR=None ; R_IN=None ; rebuild=None 
    46 TmpDir=None ; RunDir=None ; FileOut=None ; dir_ATM_his=None ; dir_SRF_his=None ; dir_OCE_his=None ; dir_ICE_his=None ; FileCommon=None 
    47 file_ATM_his=None ; file_SRF_his=None ; file_RUN_his=None ; file_OCE_his=None ;  file_ICE_his=None ; file_OCE_sca=None 
    48 tar_restart_beg=None ; tar_restart_end=None ; file_ATM_beg=None ; file_ATM_end=None ; file_DYN_beg=None ; file_DYN_end=None ; file_SRF_beg=None ; file_SRF_end=None 
    49 file_RUN_beg=None ; file_RUN_end=None ; file_RUN_end=None ; file_OCE_beg=None ; file_ICE_beg=None ; file_OCE_beg=None ; file_OCE_end=None ; file_OCE_srf=None ; file_OCE_sca=None ; file_ICE_beg=None ; file_OCE_end=None ; file_ICE_end=None 
    50  
    51 # Read command line arguments 
     69ARCHIVE=None ; STORAGE=None ; SCRATCHDIR=None ; R_IN=None ; rebuild=None ; TmpDir=None 
     70FileDir=None ; FileOut=None 
     71dir_ATM_his=None ; dir_SRF_his=None ; dir_OCE_his=None ; dir_ICE_his=None 
     72FileCommon=None ; file_ATM_his=None ; file_SRF_his=None ; file_RUN_his=None 
     73file_OCE_his=None ;  file_ICE_his=None ; file_OCE_sca=None ; file_OCE_srf=None 
     74tar_restart_beg=None ; tar_restart_end=None ; file_ATM_beg=None ; file_ATM_end=None ; file_DYN_beg=None 
     75file_DYN_end=None ; file_SRF_beg=None ; file_SRF_end=None 
     76file_RUN_beg=None ; file_RUN_end=None ; file_RUN_end=None ; file_OCE_beg=None 
     77file_ICE_beg=None ; file_OCE_beg=None 
     78file_OCE_end=None ; file_ICE_beg=None ; file_OCE_end=None ; file_ICE_end=None 
     79tar_restart_beg_ATM=None ; tar_restart_beg_DYN=None ; tar_restart_beg_SRF=None 
     80tar_restart_beg_RUN=None ; tar_restart_beg_OCE=None ; tar_restart_beg_ICE=None 
     81tar_restart_end_ATM=None ; tar_restart_end_DYN=None ; tar_restart_end_SRF=None 
     82tar_restart_end_RUN=None ; tar_restart_end_OCE=None ; tar_restart_end_ICE=None 
     83ContinueOnError=False ; ErrorCount=0 ; SortIco = False 
     84 
     85## 
     86## Precision of history file reading 
     87## --------------------------------- 
     88# Default is float (full precision). Degrade the precision by using np.float32 
     89# Restart file are always read at the full precision 
     90readPrec=float 
     91 
     92## Read command line arguments 
     93## --------------------------- 
    5294print ( "Name of Python script:", sys.argv[0] ) 
    5395IniFile = sys.argv[1] 
    54 # Text existence of IniFile 
     96 
     97# Test existence of IniFile 
    5598if not os.path.exists (IniFile ) : 
    5699    raise FileExistsError ( f"File not found : {IniFile = }" ) 
     
    63106FullIniFile = 'full_' + IniFile 
    64107 
     108## Reading config.card if possible 
     109## ------------------------------- 
     110ConfigCard = None 
     111 
     112if 'Experiment' in config.keys ()  : ## Read Experiment on Config file if possible 
     113    if 'ConfigCard' in config['Experiment'].keys () : 
     114        ConfigCard = config['Experiment']['ConfigCard'] 
     115        print ( f'{ConfigCard=}' ) 
     116 
     117if ConfigCard : ## Read config card if it exists 
     118    # Text existence of ConfigCard 
     119    if os.path.exists ( ConfigCard ) : 
     120        print ( f'Reading Config Card : {ConfigCard}' ) 
     121        ## Creates parser for reading .ini input file 
     122        MyReader = configparser.ConfigParser (interpolation=configparser.ExtendedInterpolation() ) 
     123        MyReader.optionxform = str # To keep capitals 
     124         
     125        MyReader.read (ConfigCard) 
     126 
     127        for VarName in ['JobName', 'ExperimentName', 'SpaceName', 'LongName', 'ModelName', 'TagName'] : 
     128            if VarName in MyReader['UserChoices'].keys() : 
     129                locals()[VarName] = MyReader['UserChoices'][VarName] 
     130                exec  ( f'{VarName} = wu.setBool ({VarName})' ) 
     131                exec  ( f'{VarName} = wu.setNum  ({VarName})' ) 
     132                exec  ( f'{VarName} = wu.setNone ({VarName})' ) 
     133                exec  ( f'wu.{VarName} = {VarName}' ) 
     134                print ( f'    {VarName:21} set to : {locals()[VarName]:}' ) 
     135                 
     136        for VarName in ['PackFrequency'] : 
     137            if VarName in MyReader['Post'].keys() : 
     138                locals()[VarName] = MyReader['Post'][VarName] 
     139                exec  ( f'{VarName} = wu.setBool ({VarName})' ) 
     140                exec  ( f'{VarName} = wu.setNum  ({VarName})' ) 
     141                exec  ( f'{VarName} = wu.setNone ({VarName})' ) 
     142                exec  ( f'wu.{VarName} = {VarName}' ) 
     143                print ( f'    {VarName:21} set to : {locals()[VarName]:}' ) 
     144    else : 
     145        raise FileExistsError ( f"File not found : {ConfigCard = }" ) 
     146 
     147     
    65148## Reading config file 
    66 for Section in ['Experiment', 'libIGCM', 'Files', 'Physics' ] : 
     149## ------------------- 
     150for Section in ['Config', 'Experiment', 'libIGCM', 'Files', 'Physics' ] : 
    67151   if Section in config.keys () :  
    68         print ( f'Reading [{Section}]' ) 
     152        print ( f'\nReading [{Section}]' ) 
    69153        for VarName in config[Section].keys() : 
    70154            locals()[VarName] = config[Section][VarName] 
    71             exec ( f'{VarName} = wu.setBool ({VarName})' ) 
    72             exec ( f'{VarName} = wu.setNum  ({VarName})' ) 
    73             exec ( f'{VarName} = wu.setNone ({VarName})' ) 
    74             exec ( f'wu.{VarName} = {VarName}' ) 
    75             print ( '{:25} set to : {:}'.format (VarName, locals()[VarName]) ) 
     155            exec  ( f'{VarName} = wu.setBool ({VarName})' ) 
     156            exec  ( f'{VarName} = wu.setNum  ({VarName})' ) 
     157            exec  ( f'{VarName} = wu.setNone ({VarName})' ) 
     158            exec  ( f'wu.{VarName} = {VarName}' ) 
     159            print ( f'    {VarName:21} set to : {locals()[VarName]}' ) 
    76160            #exec ( f'del {VarName}' ) 
    77161 
    78 #-- Some physical constants 
    79 if wu.unDefined ( 'Ra' )           : Ra          = 6366197.7236758135 #-- Earth Radius (m) 
    80 if wu.unDefined ( 'Grav' )         : Grav        = 9.81               #-- Gravity (m^2/s 
    81 if wu.unDefined ( 'ICE_rho_ice' )  : ICE_rho_ice = 917.0              #-- Ice volumic mass (kg/m3) in LIM3 
    82 if wu.unDefined ( 'ICE_rho_sno')   : ICE_rho_sno = 330.0              #-- Snow volumic mass (kg/m3) in LIM3 
    83 if wu.unDefined ( 'OCE_rho_liq' )  : OCE_rho_liq = 1026.0             #-- Ocean water volumic mass (kg/m3) in NEMO 
    84 if wu.unDefined ( 'ATM_rho' )      : ATM_rho     = 1000.0             #-- Water volumic mass in atmosphere (kg/m^3) 
    85 if wu.unDefined ( 'SRF_rho' )      : SRF_rho     = 1000.0             #-- Water volumic mass in surface reservoir (kg/m^3) 
    86 if wu.unDefined ( 'RUN_rho' )      : RUN_rho     = 1000.0             #-- Water volumic mass of rivers (kg/m^3) 
    87 if wu.unDefined ( 'ICE_rho_pnd' )  : ICE_rho_pnd = 1000.              #-- Water volumic mass in ice ponds (kg/m^3) 
    88 if wu.unDefined ( 'YearLength' )   : YearLength  = 365.25 * 24. * 60. * 60. #-- Year length (s) - Use only to compute drif in approximate unit  
    89  
    90 # Set libIGCM and machine dependant values 
    91 if not 'Files' in config.keys() : config['Files'] = {} 
    92  
    93 config['Physics'] = { 'Ra':Ra, 'Grav':Grav, 'ICE_rho_ice':ICE_rho_ice, 'ICE_rho_sno':ICE_rho_sno, 'OCE_rho_liq':OCE_rho_liq, 'ATM_rho':ATM_rho, 'SRF_rho':SRF_rho, 'RUN_rho':RUN_rho} 
     162print ( f'\nConfig file readed : {IniFile} ' ) 
     163 
     164## 
     165## Reading prec 
     166if wu.unDefined ( 'readPrec' )  : 
     167    readPrec = np.float64 
     168else : 
     169    if readPrec in ["float", "float64", "r8", "double", "<class 'float'>"         ] : readPrec = float 
     170    if readPrec in [         "float32", "r4", "single", "<class 'numpy.float32'>" ] : readPrec = np.float32 
     171    if readPrec in [         "float16", "r2", "half"  , "<class 'numpy.float16'>" ] : readPrec = np.float16 
     172     
     173## Some physical constants 
     174## ======================= 
     175if wu.unDefined ( 'Ra' )           : Ra          = wu.Ra           #-- Earth Radius (m) 
     176if wu.unDefined ( 'Grav' )         : Grav        = wu.Grav         #-- Gravity (m^2/s 
     177if wu.unDefined ( 'ICE_rho_ice' )  : ICE_rho_ice = wu.ICE_rho_ice  #-- Ice volumic mass (kg/m3) in LIM3 
     178if wu.unDefined ( 'ICE_rho_sno')   : ICE_rho_sno = wu.ICE_rho_sno  #-- Snow volumic mass (kg/m3) in LIM3 
     179if wu.unDefined ( 'OCE_rho_liq' )  : OCE_rho_liq = wu.OCE_rho_liq  #-- Ocean water volumic mass (kg/m3) in NEMO 
     180if wu.unDefined ( 'ATM_rho' )      : ATM_rho     = wu.ATM_rho      #-- Water volumic mass in atmosphere (kg/m^3) 
     181if wu.unDefined ( 'SRF_rho' )      : SRF_rho     = wu.SRF_rho      #-- Water volumic mass in surface reservoir (kg/m^3) 
     182if wu.unDefined ( 'RUN_rho' )      : RUN_rho     = wu.RUN_rho      #-- Water volumic mass of rivers (kg/m^3) 
     183if wu.unDefined ( 'ICE_rho_pnd' )  : ICE_rho_pnd = wu.ICE_rho_pnd  #-- Water volumic mass in ice ponds (kg/m^3) 
     184if wu.unDefined ( 'YearLength' )   : YearLength  = wu.YearLength   #-- Year length (s) 
     185 
     186## Set libIGCM and machine dependant values 
     187## ---------------------------------------- 
     188if not 'Files' in config.keys () : config['Files'] = {} 
     189 
     190config['Physics'] = { 'Ra':str(Ra), 'Grav':str(Grav), 'ICE_rho_ice':str(ICE_rho_ice), 'ICE_rho_sno':str(ICE_rho_sno), 
     191                      'OCE_rho_liq':str(OCE_rho_liq), 'ATM_rho':str(ATM_rho), 'SRF_rho':str(SRF_rho), 'RUN_rho':str(RUN_rho)} 
     192 
     193config['Config'] = { 'ContinueOnError':str(ContinueOnError), 'SortIco':str(SortIco), 'TestInterp':str(TestInterp), 'readPrec':str(readPrec) } 
    94194 
    95195## -------------------------- 
     
    97197LMDZ = ( 'LMD' in wu.ATM ) 
    98198 
    99 with open ('SetLibIGCM.py') as f: exec ( f.read() ) 
     199mm = libIGCM_sys.config ( TagName=TagName, SpaceName=SpaceName, ExperimentName=ExperimentName, JobName=JobName, User=User, Group=Group, 
     200             ARCHIVE=None, SCRATCHDIR=None, STORAGE=None, R_IN=None, R_OUT=None, R_FIG=None, rebuild=None, TmpDir=None,  
     201             R_SAVE=None, R_FIGR=None, R_BUFR=None, R_BUF_KSH=None, REBUILD_DIR=None, POST_DIR=None ) 
     202globals().update(mm) 
     203 
    100204config['Files']['TmpDir'] = TmpDir 
    101  
    102 if libIGCM : 
    103     config['libIGCM'] = {'ARCHIVE':ARCHIVE, 'STORAGE':STORAGE, 'SCRATCHDIR':SCRATCHDIR, 'R_IN':R_IN, 'rebuild':rebuild } 
    104  
    105 # Import specific module 
    106 import nemo, lmdz 
    107 ## Now import needed scientific modules 
    108 import xarray as xr 
    109      
    110 # Output file with water budget diagnostics 
    111 if wu.unDefined ( 'FileOut' ) : FileOut = f'CPL_waterbudget_{JobName}_{YearBegin}_{YearEnd}.out' 
     205config['libIGCM'] = { 'ARCHIVE':ARCHIVE, 'STORAGE':STORAGE, 'TmpDir':TmpDir, 'R_IN':R_IN, 'rebuild':rebuild } 
     206     
     207## Defines begining and end of experiment 
     208## -------------------------------------- 
     209if wu.unDefined ( 'DateBegin' ) : 
     210    DateBegin = f'{YearBegin}0101' 
     211    config['Experiment']['DateBegin'] = str(DateBegin) 
     212else : 
     213    YearBegin, MonthBegin, DayBegin = wu.SplitDate ( DateBegin ) 
     214    DateBegin = wu.FormatToGregorian (DateBegin) 
     215    config['Experiment']['YearBegin'] = str(YearBegin) 
     216 
     217if wu.unDefined ( 'DateEnd' )   : 
     218    DateEnd   = f'{YearEnd}1231' 
     219    config['Experiment']['DateEnd'] = str(DateEnd) 
     220else : 
     221    YearEnd, MonthEnd, DayEnd = wu.SplitDate ( DateEnd ) 
     222    DateEnd   = wu.FormatToGregorian (DateEnd) 
     223    config['Experiment']['DateEnd'] = str(DateEnd) 
     224 
     225if wu.unDefined ( 'PackFrequency' ) : 
     226    PackFrequency = YearEnd - YearBegin + 1 
     227    config['Experiment']['PackFrequency']   = f'{PackFrequency}' 
     228 
     229if type ( PackFrequency ) == str :  
     230    if 'Y' in PackFrequency : PackFrequency = PackFrequency.replace ( 'Y', '')  
     231    if 'M' in PackFrequency : PackFrequency = PackFrequency.replace ( 'M', '') 
     232    PackFrequency = int ( PackFrequency ) 
     233     
     234## Output file with water budget diagnostics 
     235## ----------------------------------------- 
     236if wu.unDefined ( 'FileOut' ) : 
     237    FileOut = f'CPL_waterbudget_{JobName}_{YearBegin}_{YearEnd}' 
     238    if ICO :  
     239        if ATM_HIS == 'latlon' : FileOut = f'{FileOut}_LATLON' 
     240        if ATM_HIS == 'ico'    : FileOut = f'{FileOut}_ICO' 
     241    if readPrec == np.float32  : FileOut = f'{FileOut}_float32' 
     242    FileOut = f'{FileOut}.out' 
     243 
    112244config['Files']['FileOut'] = FileOut 
    113245 
    114246f_out = open ( FileOut, mode = 'w' ) 
    115247     
    116 # Useful functions 
     248## Useful functions 
     249## ---------------- 
     250if readPrec == float : 
     251    def rprec (tab) : return tab 
     252else :  
     253    def rprec (tab) : return tab.astype(readPrec).astype(float) 
     254     
    117255def kg2Sv    (val, rho=ATM_rho) : 
    118256    '''From kg to Sverdrup''' 
     
    124262 
    125263def var2prt (var, small=False, rho=ATM_rho) : 
    126     if small :  return var , kg2Sv(var, rho=rho)*1000., kg2myear(var, rho=rho)*1000. 
     264    if small :  return var , kg2Sv(var, rho=rho)*1000., kg2myear(var, rho=rho)*1000 
    127265    else     :  return var , kg2Sv(var, rho=rho)      , kg2myear(var, rho=rho) 
    128266 
    129267def prtFlux (Desc, var, Form='F', small=False, rho=ATM_rho, width=15) : 
    130268    if small : 
    131         if Form in ['f', 'F'] : ff=" {:12.4e} kg | {:12.4f} mSv | {:12.4f} mm/year " 
    132         if Form in ['e', 'E'] : ff=" {:12.4e} kg | {:12.4e} mSv | {:12.4e} mm/year " 
     269        if Form in ['f', 'F'] : ff=" {:14.6e} kg | {:12.4f} mSv | {:12.4f} mm/year " 
     270        if Form in ['e', 'E'] : ff=" {:14.6e} kg | {:12.4e} mSv | {:12.4e} mm/year " 
    133271    else : 
    134         if Form in ['f', 'F'] : ff=" {:12.4e} kg | {:12.4f} Sv  | {:12.4f} m/year  " 
    135         if Form in ['e', 'E'] : ff=" {:12.4e} kg | {:12.4e} Sv  | {:12.4e} m/year  " 
    136     echo ( (' {:>{width}} = ' +ff).format (Desc, *var2prt(var, small, rho=rho), width=width ) ) 
     272        if Form in ['f', 'F'] : ff=" {:14.6e} kg | {:12.4f} Sv  | {:12.4f} m/year  " 
     273        if Form in ['e', 'E'] : ff=" {:14.6e} kg | {:12.4e} Sv  | {:12.4e} m/year  " 
     274    echo ( (' {:>{width}} = ' +ff).format (Desc, *var2prt(var, small=small, rho=rho), width=width ) ) 
    137275    return None 
    138276 
     
    144282    f_out.flush () 
    145283    return None 
    146      
     284 
     285echo ( f'{ContinueOnError = }' ) 
     286echo ( f'{SortIco         = }' ) 
     287echo ( f'{readPrec        = }' ) 
     288 
     289echo ( f'{JobName         = }' ) 
     290echo ( f'{ConfigCard      = }' ) 
     291echo ( f'{libIGCM         = }' )      
     292echo ( f'{User            = }' )        
     293echo ( f'{Group           = }' )        
     294echo ( f'{Freq            = }' )        
     295echo ( f'{YearBegin       = }' )      
     296echo ( f'{YearEnd         = }' )      
     297echo ( f'{DateBegin       = }' ) 
     298echo ( f'{DateEnd         = }' ) 
     299echo ( f'{PackFrequency   = }' )  
     300echo ( f'{ATM             = }' )        
     301echo ( f'{Routing         = }' )        
     302echo ( f'{ORCA            = }' )       
     303echo ( f'{NEMO            = }' )       
     304echo ( f'{Coupled         = }' )       
     305echo ( f'{ATM_HIS         = }' )       
     306echo ( f'{SRF_HIS         = }' )       
     307echo ( f'{RUN_HIS         = }' ) 
     308 
    147309## Set libIGCM directories 
     310## ----------------------- 
    148311if wu.unDefined ('R_OUT'      ) : R_OUT       = os.path.join ( ARCHIVE   , 'IGCM_OUT' ) 
    149312if wu.unDefined ('R_BUF'      ) : R_BUF       = os.path.join ( SCRATCHDIR, 'IGCM_OUT' ) 
     
    156319if wu.unDefined ('R_FIGR'     ) : R_FIGR      = os.path.join ( STORAGE, 'IGCM_OUT', L_EXP ) 
    157320 
    158 config['libIGCM'] = { 'R_OUT':R_OUT, 'R_BUF':R_BUF, 'L_EXP':L_EXP, 'R_BUFR':R_BUFR, 'POST_DIR':POST_DIR, 'REBUILD_DIR':REBUILD_DIR, 'R_BUF_KSH':R_BUF_KSH, 'R_FIGR':R_FIGR } 
    159  
    160 # Set directory to extract filesa 
    161 if RunDir == None : RunDir = os.path.join ( TmpDir, f'WATER_{JobName}_{YearBegin}_{YearEnd}' ) 
    162 config['Files']['RunDir'] = RunDir 
    163  
    164 if not os.path.isdir ( RunDir ) : os.makedirs ( RunDir ) 
    165  
    166 # Set directories to rebuild ocean and ice restart files 
    167 RunDirOCE = os.path.join ( RunDir, 'OCE' ) 
    168 RunDirICE = os.path.join ( RunDir, 'ICE' ) 
    169 #RunDirATM = os.path.join ( RunDir, 'ATM' ) 
    170 #RunDirSRF = os.path.join ( RunDir, 'SRF' ) 
    171 #RunDirRUN = os.path.join ( RunDir, 'RUN' ) 
    172 #RunDirDYN = os.path.join ( RunDir, 'DYN' ) 
    173 if not os.path.exists ( RunDirOCE ) : os.mkdir ( RunDirOCE ) 
    174 if not os.path.exists ( RunDirICE ) : os.mkdir ( RunDirICE ) 
     321config['libIGCM'].update ( { 'R_OUT':R_OUT, 'R_BUF':R_BUF, 'L_EXP':L_EXP, 'R_BUFR':R_BUFR, 'POST_DIR':POST_DIR, 
     322                      'REBUILD_DIR':REBUILD_DIR, 'R_BUF_KSH':R_BUF_KSH, 'R_FIGR':R_FIGR, 'rebuild':rebuild } ) 
     323 
     324## Set directory to extract files 
     325## ------------------------------ 
     326if wu.unDefined ( 'FileDir' ) : FileDir = os.path.join ( TmpDir, f'WATER_{JobName}' ) 
     327config['Files']['FileDir'] = FileDir 
     328 
     329if not os.path.isdir ( FileDir ) : os.makedirs ( FileDir ) 
     330 
     331##- Set directories to rebuild ocean and ice restart files 
     332if wu.unDefined ( 'FileDirOCE' ) : FileDirOCE = os.path.join ( FileDir, 'OCE' ) 
     333if wu.unDefined ( 'FileDirICE' ) : FileDirICE = os.path.join ( FileDir, 'ICE' ) 
     334if not os.path.exists ( FileDirOCE ) : os.mkdir ( FileDirOCE ) 
     335if not os.path.exists ( FileDirICE ) : os.mkdir ( FileDirICE ) 
     336 
     337echo (' ') 
     338echo ( f'JobName     : {JobName}'    ) 
     339echo ( f'Comment     : {Comment}'    ) 
     340echo ( f'TmpDir      : {TmpDir}'     ) 
     341echo ( f'FileDir     : {FileDir}'    ) 
     342echo ( f'FileDirOCE  : {FileDirOCE}' ) 
     343echo ( f'FileDirICE  : {FileDirICE}' ) 
     344 
     345echo ( f'\nDealing with {L_EXP}'  ) 
    175346 
    176347echo (' ') 
     
    178349echo ( f'Comment   : {Comment}'   ) 
    179350echo ( f'TmpDir    : {TmpDir}'    ) 
    180 echo ( f'RunDirOCE : {RunDirOCE}' ) 
    181 echo ( f'RunDirICE : {RunDirICE}' ) 
    182351 
    183352echo ( f'\nDealing with {L_EXP}'  ) 
    184353 
    185 #-- Model output directories 
     354## Creates model output directory names 
     355## ------------------------------------ 
    186356if Freq == "MO" : FreqDir =  os.path.join ('Output' , 'MO' ) 
    187357if Freq == "SE" : FreqDir =  os.path.join ('Analyse', 'SE' ) 
     
    205375echo ( f'{dir_SRF_his}' ) 
    206376 
    207 #-- Creates files names 
    208 if Period == None : 
    209     if Freq == 'MO' : Period = f'{YearBegin}0101_{YearEnd}1231_1M' 
    210     if Freq == 'SE' : Period = f'SE_{YearBegin}0101_{YearEnd}1231_1M' 
     377##-- Creates files names 
     378if wu.unDefined ( 'Period' ) : 
     379    if Freq == 'MO' : Period = f'{DateBegin}_{DateEnd}_1M' 
     380    if Freq == 'SE' : Period = f'SE_{DateBegin}_{DateEnd}_1M' 
    211381    config['Files']['Period'] = Period 
    212 if FileCommon == None : 
     382 
     383config['Files']['DateBegin'] = DateBegin 
     384config['Files']['DateBegin'] = DateEnd 
     385 
     386echo ( f'Period   : {Period}' ) 
     387 
     388if wu.unDefined ( 'FileCommon' ) : 
    213389    FileCommon = f'{JobName}_{Period}' 
    214390    config['Files']['FileCommon'] = FileCommon 
    215391 
    216 if Title == None : 
    217     Title = f'{JobName} : {Freq} : {YearBegin}-01-01 - {YearEnd}-12-31' 
     392if wu.unDefined ( 'Title' ) : 
     393    Title = f'{JobName} : {Freq} : {DateBegin} - {DateEnd}' 
    218394    config['Files']['Title'] = Title 
    219  
    220395echo ('\nOpen history files' ) 
    221 if file_ATM_his == None :  
    222     file_ATM_his = os.path.join (  dir_ATM_his, f'{FileCommon}_histmth.nc' ) 
     396if wu.unDefined ( 'file_ATM_his' ) : 
     397    if ATM_HIS == 'latlon' : 
     398        file_ATM_his = os.path.join ( dir_ATM_his, f'{FileCommon}_histmth.nc' ) 
     399    if ATM_HIS == 'ico' : 
     400        file_ATM_his = os.path.join ( dir_ATM_his, f'{FileCommon}_histmth_ico.nc' ) 
    223401    config['Files']['file_ATM_his'] = file_ATM_his 
    224 if file_SRF_his == None : 
    225     file_SRF_his = os.path.join (  dir_SRF_his, f'{FileCommon}_sechiba_history.nc' ) 
     402if wu.unDefined ( 'file_SRF_his' ) : 
     403    if ATM_HIS == 'latlon' : 
     404        file_SRF_his = os.path.join ( dir_SRF_his, f'{FileCommon}_sechiba_history.nc' ) 
     405    if ATM_HIS == 'ico' : 
     406        file_SRF_his = os.path.join ( dir_SRF_his, f'{FileCommon}_sechiba_history_ico.nc' ) 
    226407    config['Files']['file_SRF_his'] = file_SRF_his 
    227 #if Routing == 'SECHIBA'  : 
    228 #     file_RUN_his = os.path.join (  dir_SRF_his, f'{FileCommon}_sechiba_history.nc' ) 
     408 
    229409if Routing == 'SIMPLE' : 
    230     if file_RUN_his == None :  
    231         file_RUN_his = os.path.join (  dir_SRF_his, f'{FileCommon}_sechiba_history.nc' ) 
     410    if file_RUN_his == None : 
     411        if ATM_HIS == 'latlon' : 
     412            file_RUN_his = os.path.join ( dir_SRF_his, f'{FileCommon}_sechiba_history.nc' ) 
     413        if ATM_HIS == 'ico' : 
     414            file_RUN_his = os.path.join ( dir_SRF_his, f'{FileCommon}_sechiba_history_ico.nc' ) 
    232415        config['Files']['file_RUN_his'] = file_RUN_his 
    233 if file_OCE_his == None : 
    234     file_OCE_his = os.path.join (  dir_OCE_his, f'{FileCommon}_grid_T.nc' ) 
    235     config['Files']['file_OCE_his'] = file_OCE_his 
    236 if file_OCE_sca == None : 
    237     file_OCE_sca = os.path.join (  dir_OCE_his, f'{FileCommon}_scalar.nc' ) 
    238     config['Files']['file_OCE_sca'] = file_OCE_sca 
    239 if file_ICE_his == None : 
    240     file_ICE_his = os.path.join (  dir_ICE_his, f'{FileCommon}_icemod.nc' ) 
    241     config['Files']['file_ICE_his'] = file_ICE_his 
    242 if file_OCE_srf == None : 
    243     file_OCE_srf = os.path.join (  dir_OCE_his, f'{FileCommon}_grid_T.nc' ) 
    244     config['Files']['file_OCE_srf'] = file_OCE_srf 
    245  
    246 d_ATM_his = xr.open_dataset ( file_ATM_his, use_cftime=True, decode_times=True, decode_cf=True ).squeeze() 
    247 d_OCE_his = xr.open_dataset ( file_OCE_his, use_cftime=True, decode_times=True, decode_cf=True ).squeeze() 
    248 d_OCE_sca = xr.open_dataset ( file_OCE_sca, use_cftime=True, decode_times=True, decode_cf=True ).squeeze() 
    249 d_ICE_his = xr.open_dataset ( file_ICE_his, use_cftime=True, decode_times=True, decode_cf=True ).squeeze() 
    250 if NEMO == '3.6' :d_ICE_his = d_ICE_his.rename ( {'y_grid_T':'y', 'x_grid_T':'x'} ) 
    251 d_SRF_his = xr.open_dataset ( file_SRF_his, use_cftime=True, decode_times=True, decode_cf=True ).squeeze() 
    252 d_OCE_srf = xr.open_dataset ( file_OCE_srf, use_cftime=True, decode_times=True, decode_cf=True ).squeeze() 
    253 if Routing == 'SECHIBA' : d_RUN_his = d_SRF_his 
    254 if Routing == 'SIMPLE'  : d_RUN_his = xr.open_dataset ( file_RUN_his, use_cftime=True, decode_times=True, decode_cf=True ).squeeze() 
    255  
    256      
     416 
    257417echo ( f'{file_ATM_his = }' ) 
    258418echo ( f'{file_SRF_his = }' ) 
    259419if Routing == 'SIMPLE' : echo ( f'{file_RUN_his = }' ) 
     420         
     421d_ATM_his = xr.open_dataset ( file_ATM_his, use_cftime=True, decode_times=True, decode_cf=True ).squeeze() 
     422d_SRF_his = xr.open_dataset ( file_SRF_his, use_cftime=True, decode_times=True, decode_cf=True ).squeeze() 
     423if Routing == 'SECHIBA' : d_RUN_his = d_SRF_his 
     424if Routing == 'SIMPLE'  : d_RUN_his = xr.open_dataset ( file_RUN_his, use_cftime=True, decode_times=True, decode_cf=True ).squeeze() 
     425     
     426if wu.unDefined ('file_OCE_his' ) : 
     427    file_OCE_his = os.path.join ( dir_OCE_his, f'{FileCommon}_grid_T.nc' ) 
     428    file_OCE_his = file_OCE_his 
     429if wu.unDefined ('file_OCE_sca' ) :     
     430    file_OCE_sca = os.path.join ( dir_OCE_his, f'{FileCommon}_scalar.nc' ) 
     431    config['Files']['file_OCE_sca'] = file_OCE_sca 
     432if wu.unDefined ('file_OCE_srf' ) :     
     433    file_OCE_srf = os.path.join ( dir_OCE_his, f'{FileCommon}_sbc.nc' ) 
     434    config['Files']['file_OCE_srf'] = file_OCE_srf 
     435if wu.unDefined ( 'file_ICE_hi' ) :  
     436    file_ICE_his = os.path.join ( dir_ICE_his, f'{FileCommon}_icemod.nc' ) 
     437    config['Files']['file_ICE_his'] = file_ICE_his 
     438 
     439d_OCE_his = xr.open_dataset ( file_OCE_his, use_cftime=True, decode_times=True, decode_cf=True ).squeeze() 
     440d_OCE_sca = xr.open_dataset ( file_OCE_sca, use_cftime=True, decode_times=True, decode_cf=True ).squeeze() 
     441#d_OCE_srf = xr.open_dataset ( file_OCE_srf, use_cftime=True, decode_times=True, decode_cf=True ).squeeze() 
     442d_ICE_his = xr.open_dataset ( file_ICE_his, use_cftime=True, decode_times=True, decode_cf=True ).squeeze() 
     443if NEMO == '3.6' :d_ICE_his = d_ICE_his.rename ( {'y_grid_T':'y', 'x_grid_T':'x'} ) 
     444 
    260445echo ( f'{file_OCE_his = }' ) 
    261446echo ( f'{file_ICE_his = }' ) 
     
    264449 
    265450## Compute run length 
     451## ------------------ 
    266452dtime = ( d_ATM_his.time_counter_bounds.max() - d_ATM_his.time_counter_bounds.min() ) 
    267453echo ('\nRun length : {:8.2f} days'.format ( (dtime/np.timedelta64(1, "D")).values ) ) 
     
    278464NbYear = dtime_sec / YearLength 
    279465 
    280 #-- Open restart files 
    281 YearRes = YearBegin - 1        # Year of the restart of beginning of simulation 
    282 YearPre = YearBegin - PackFrequency  # Year to find the tarfile of the restart of beginning of simulation 
    283  
    284 config['Files']['YearPre'] = f'{YearBegin}' 
    285  
    286 echo (f'Restart dates - Start : {YearRes}-12-31  /  End : {YearEnd}-12-31 ') 
    287  
    288 if TarRestartPeriod_beg == None :  
    289     echo (f'Restart dates - Start : {YearRes}-12-31  /  End : {YearEnd}-12-31 ') 
    290     TarRestartPeriod_beg = f'{YearPre}0101_{YearRes}1231' 
    291     config['Files']['TarRestartPeriod_beg'] = TarRestartPeriod_beg 
    292  
    293 if TarRestartPeriod_end == None :  
    294     YearPre = YearBegin - PackFrequency  # Year to find the tarfile of the restart of beginning of simulation 
    295     echo (f'Restart dates - Start : {YearRes}-12-31  /  End : {YearEnd}-12-31 ') 
    296     TarRestartPeriod_end = f'{YearBegin}0101_{YearEnd}1231' 
    297     config['Files']['TarRestartPeriod_end'] = TarRestartPeriod_end 
    298  
    299 if tar_restart_beg == None : 
    300     tar_restart_beg = os.path.join ( R_SAVE, 'RESTART', f'{JobName}_{TarRestartPeriod_beg}_restart.tar' ) 
    301     config['Files']['tar_restart_beg'] = tar_restart_beg 
    302 if tar_restart_end == None : 
    303     tar_restart_end = os.path.join ( R_SAVE, 'RESTART', f'{JobName}_{TarRestartPeriod_end}_restart.tar' ) 
    304     config['Files']['tar_restart_end'] = tar_restart_end 
    305  
    306 echo ( f'{tar_restart_beg}' ) 
    307 echo ( f'{tar_restart_end}' ) 
    308  
    309 if file_ATM_beg == None :  
    310     file_ATM_beg = f'{RunDir}/ATM_{JobName}_{YearRes}1231_restartphy.nc' 
    311     config['Files']['file_ATM_beg'] = file_ATM_beg 
    312 if file_ATM_end == None : 
    313     file_ATM_end = f'{RunDir}/ATM_{JobName}_{YearEnd}1231_restartphy.nc' 
    314     config['Files']['file_ATM_end'] = file_ATM_end 
    315  
    316 if file_DYN_beg == None : 
    317     if LMDZ : file_DYN_beg = f'{RunDir}/ATM_{JobName}_{YearRes}1231_restart.nc' 
    318     if ICO  : file_DYN_beg = f'{RunDir}/ICO_{JobName}_{YearRes}1231_restart.nc' 
    319     config['Files']['file_DYN_beg'] = file_DYN_beg 
    320      
    321 if file_DYN_end == None :  
    322     if LMDZ : file_DYN_end = f'{RunDir}/ATM_{JobName}_{YearEnd}1231_restart.nc' 
    323     if ICO  : file_DYN_end = f'{RunDir}/ICO_{JobName}_{YearEnd}1231_restart.nc' 
    324     config['Files']['file_DYN_end'] = file_DYN_end 
    325      
    326 if file_SRF_beg == None : 
    327     file_SRF_beg = f'{RunDir}/SRF_{JobName}_{YearRes}1231_sechiba_rest.nc' 
    328     config['Files']['file_SRF_beg'] = file_SRF_beg 
    329 if file_SRF_end == None : 
    330     file_SRF_end = f'{RunDir}/SRF_{JobName}_{YearEnd}1231_sechiba_rest.nc' 
    331     config['Files']['file_SRF_end'] = file_SRF_end 
    332      
    333 if file_OCE_beg == None :  
    334     file_OCE_beg = f'{RunDir}/OCE_{JobName}_{YearRes}1231_restart.nc' 
    335     config['Files']['file_OCE_beg'] = file_OCE_beg 
    336 if file_OCE_end == None : 
    337     file_OCE_end = f'{RunDir}/OCE_{JobName}_{YearEnd}1231_restart.nc' 
    338     config['Files']['file_OCE_end'] = file_OCE_end 
    339 if file_ICE_beg == None : 
    340     file_ICE_beg = f'{RunDir}/ICE_{JobName}_{YearRes}1231_restart_icemod.nc' 
    341     config['Files']['file_ICE_beg'] = file_ICE_beg 
    342 if file_ICE_end == None :  
    343     file_ICE_end = f'{RunDir}/ICE_{JobName}_{YearEnd}1231_restart_icemod.nc' 
    344     config['Files']['file_ICE_end'] = file_ICE_end 
    345  
    346 liste_beg = [file_ATM_beg, file_DYN_beg, file_SRF_beg] 
    347 liste_end = [file_ATM_end, file_DYN_end, file_SRF_end] 
    348  
    349 if Routing == 'SIMPLE' : 
    350     if file_RUN_beg == None :  
    351         file_RUN_beg = f'{RunDir}/SRF_{JobName}_{YearRes}1231_routing_restart.nc' 
    352         config['Files']['file_RUN_beg'] = file_RUN_beg 
    353     if file_RUN_end == None :  
    354         file_RUN_end = f'{RunDir}/SRF_{JobName}_{YearEnd}1231_routing_restart.nc' 
    355         config['Files']['file_RUN_end'] = file_RUN_end 
    356          
    357     liste_beg.append ( file_RUN_beg ) 
    358     liste_end.append ( file_RUN_end ) 
    359     echo ( f'{file_RUN_beg = }' ) 
    360     echo ( f'{file_RUN_end = }' ) 
    361  
    362 echo ( f'{file_ATM_beg = }' ) 
    363 echo ( f'{file_ATM_end = }' ) 
    364 echo ( f'{file_DYN_beg = }' ) 
    365 echo ( f'{file_DYN_end = }' ) 
    366 echo ( f'{file_SRF_beg = }' ) 
    367 echo ( f'{file_SRF_end = }' ) 
    368 echo ( f'{file_RUN_beg = }' ) 
    369 echo ( f'{file_RUN_end = }' ) 
    370 echo ( f'{file_OCE_beg = }' ) 
    371 echo ( f'{file_OCE_end = }' ) 
    372 echo ( f'{file_ICE_beg = }' ) 
    373 echo ( f'{file_ICE_end = }' ) 
    374  
    375 echo ('\nExtract restart files from tar : ATM, ICO and SRF') 
    376 for resFile in liste_beg + liste_end : 
    377     if os.path.exists ( os.path.join (RunDir, resFile) ) : 
    378         echo ( f'file found : {resFile = }' ) 
    379     else : 
    380         base_file = Path (file_name).stem # basename, and remove suffix 
    381         command =  f'cd {RunDir} ; tar xf {tar_restart_beg} {base_resFile}.nc' 
    382         echo ( command ) 
    383         ierr = os.system ( command ) 
    384         if ierr == 0 : echo ( f'tar done : {base_resFile}') 
    385         else         : raise Exception ( f'command failed : {command}' ) 
    386  
    387 echo ('\nOpening ATM SRF and ICO restart files') 
    388 d_ATM_beg = xr.open_dataset ( os.path.join (RunDir, file_ATM_beg), decode_times=False, decode_cf=True).squeeze() 
    389 d_ATM_end = xr.open_dataset ( os.path.join (RunDir, file_ATM_end), decode_times=False, decode_cf=True).squeeze() 
    390 d_SRF_beg = xr.open_dataset ( os.path.join (RunDir, file_SRF_beg), decode_times=False, decode_cf=True).squeeze() 
    391 d_SRF_end = xr.open_dataset ( os.path.join (RunDir, file_SRF_end), decode_times=False, decode_cf=True).squeeze() 
    392 d_DYN_beg = xr.open_dataset ( os.path.join (RunDir, file_DYN_beg), decode_times=False, decode_cf=True).squeeze() 
    393 d_DYN_end = xr.open_dataset ( os.path.join (RunDir, file_DYN_end), decode_times=False, decode_cf=True).squeeze() 
    394  
    395 echo ('\nExtract and rebuild OCE and ICE restarts') 
    396 def get_ndomain (zfile) : 
    397     #d_zfile = xr.open_dataset (zfile, decode_times=False).squeeze() 
    398     #ndomain_opa = d_zfile.attrs['DOMAIN_number_total'] 
    399     #d_zfile.close () 
    400     ndomain_opa = subprocess.getoutput ( f'ls {zfile}_*.nc | wc -l' ) #.format() 
    401     return int (ndomain_opa) 
    402  
    403 def extract_and_rebuild ( file_name=file_OCE_beg, tar_restart=tar_restart_end, RunDirComp=RunDirOCE ) : 
    404     '''Extract restart file from tar. Rebuild ocean files if needed''' 
    405     echo ( f'file to extract : {file_name} ' ) 
    406     if os.path.exists ( file_name ) : 
    407         echo ( f'-- File ready : {file_name}' ) 
    408     else :  
    409         echo ( f'-- Extracting {file_name}' ) 
    410         base_resFile = Path (file_name).stem # basename, and remove suffix 
    411         # Try to extract the rebuilded file 
    412         command =  f'cd {RunDirComp} ; tar xf {tar_restart} {base_resFile}.nc' 
    413         echo ( command ) 
    414         ierr = os.system ( command ) 
    415         if ierr == 0 : 
    416             echo ( f'tar done : {base_resFile}') 
    417             command = f'cd {RunDirComp} ; mv {base_resFile}.nc {RunDir}' 
    418             ierr = os.system ( command ) 
    419             if ierr == 0 : echo ( f'command done : {command}' ) 
    420             else         : raise Exception ( f'command failed : {command}' ) 
    421         else : 
    422             if not os.path.exists ( os.path.join (RunDir, f'{base_resFile}_0000.nc') ): 
    423                 command =  f'cd {RunDirComp} ; tar xf {tar_restart_end} {base_resFile}_*.nc' 
    424                 echo ( command ) 
    425                 ierr = os.system ( command ) 
    426                 if ierr == 0 : echo ( f'tar done : {file_OCE_beg}') 
    427                 else         : raise Exception ( f'command failed : {command}' ) 
    428                 echo ('extract ndomain' ) 
    429             ndomain_opa = get_ndomain ( os.path.join (RunDir, f'{base_resFile}') ) 
    430             command = f'cd {RunDirComp} ; {rebuild} {base_resFile} {ndomain_opa} ; mv {base_resFile}.nc {RunDir}' 
    431             echo ( command ) 
    432             ierr = os.system ( command ) 
    433             if ierr == 0 : echo ( f'Rebuild done : {base_resFile}.nc') 
    434             else         : raise Exception ( f'command failed : {command}' ) 
    435  
    436 extract_and_rebuild ( file_name=file_OCE_beg, tar_restart=tar_restart_beg, RunDirComp=RunDirOCE ) 
    437 extract_and_rebuild ( file_name=file_OCE_end, tar_restart=tar_restart_end, RunDirComp=RunDirOCE ) 
    438 extract_and_rebuild ( file_name=file_ICE_beg, tar_restart=tar_restart_beg, RunDirComp=RunDirICE ) 
    439 extract_and_rebuild ( file_name=file_ICE_end, tar_restart=tar_restart_end, RunDirComp=RunDirICE ) 
    440  
    441 echo ('Opening OCE and ICE restart files') 
    442 if NEMO == 3.6 :  
    443     d_OCE_beg = xr.open_dataset ( os.path.join (RunDir, file_OCE_beg), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
    444     d_OCE_end = xr.open_dataset ( os.path.join (RunDir, file_OCE_end), decode_times=False, decode_cf=True).squeeze() 
    445     d_ICE_beg = xr.open_dataset ( os.path.join (RunDir, file_ICE_beg), decode_times=False, decode_cf=True).squeeze() 
    446     d_ICE_end = xr.open_dataset ( os.path.join (RunDir, file_ICE_end), decode_times=False, decode_cf=True).squeeze() 
    447 if NEMO == 4.0 or NEMO == 4.2 :  
    448     d_OCE_beg = xr.open_dataset ( os.path.join (RunDir, file_OCE_beg), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
    449     d_OCE_end = xr.open_dataset ( os.path.join (RunDir, file_OCE_end), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
    450     d_ICE_beg = xr.open_dataset ( os.path.join (RunDir, file_ICE_beg), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
    451     d_ICE_end = xr.open_dataset ( os.path.join (RunDir, file_ICE_end), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
    452  
    453466## Write the full configuration 
    454467config_out = open (FullIniFile, 'w') 
     
    456469config_out.close () 
    457470 
    458 for var in d_SRF_beg.variables : 
    459     d_SRF_beg[var] = d_SRF_beg[var].where (  d_SRF_beg[var]<1.e20, 0.) 
    460     d_SRF_end[var] = d_SRF_end[var].where (  d_SRF_end[var]<1.e20, 0.) 
    461  
    462 if ICO : 
    463     d_RUN_beg = xr.open_dataset ( os.path.join (RunDir, file_RUN_beg), decode_times=False, decode_cf=True).squeeze() 
    464     d_RUN_end = xr.open_dataset ( os.path.join (RunDir, file_RUN_end), decode_times=False, decode_cf=True).squeeze() 
    465  
    466 def kg2Sv  (val, rho=OCE_rho_liq) : 
    467     '''From kg to Sverdrup''' 
    468     return val/dtime_sec*1.0e-6/rho 
    469  
    470 def kg2myear (val, rho=OCE_rho_liq) : 
    471     '''From kg to m/year''' 
    472     return val/OCE_aire_tot/rho/NbYear 
    473  
    474 def var2prt (var, small=False) : 
    475     if small :  return var , kg2Sv(var)*1000., kg2myear(var)*1000. 
    476     else     :  return var , kg2Sv(var)      , kg2myear(var) 
    477  
    478 def prtFlux (Desc, var, Form='F', small=False) : 
    479     if small : 
    480         if Form in ['f', 'F'] : ff=" {:12.4e} kg | {:12.4f} mSv | {:12.4f} mm/year " 
    481         if Form in ['e', 'E'] : ff=" {:12.4e} kg | {:12.4e} mSv | {:12.4e} mm/year " 
    482     else : 
    483         if Form in ['f', 'F'] : ff=" {:12.4e} kg | {:12.4f} Sv  | {:12.4f} m/year  " 
    484         if Form in ['e', 'E'] : ff=" {:12.4e} kg | {:12.4e} Sv  | {:12.4e} m/year  " 
    485     echo ( (' {:>15} = ' +ff).format (Desc, *var2prt(var, small) ) ) 
    486     return None 
    487  
    488  
    489  
    490471# ATM grid with cell surfaces 
     472if LMDZ : 
     473    echo ('ATM grid with cell surfaces : LMDZ') 
     474    ATM_lat       = lmdz.geo2point (   rprec (d_ATM_his ['lat'])+0*rprec (d_ATM_his ['lon']), dim1D='cell' ) 
     475    ATM_lon       = lmdz.geo2point ( 0*rprec (d_ATM_his ['lat'])+  rprec (d_ATM_his ['lon']), dim1D='cell' ) 
     476    ATM_aire      = lmdz.geo2point ( rprec (d_ATM_his ['aire'] )    [0], cumulPoles=True, dim1D='cell' ) 
     477    ATM_fter      = lmdz.geo2point ( rprec (d_ATM_his ['fract_ter'][0]), dim1D='cell' ) 
     478    ATM_foce      = lmdz.geo2point ( rprec (d_ATM_his ['fract_oce'][0]), dim1D='cell' ) 
     479    ATM_fsic      = lmdz.geo2point ( rprec (d_ATM_his ['fract_sic'][0]), dim1D='cell' ) 
     480    ATM_flic      = lmdz.geo2point ( rprec (d_ATM_his ['fract_lic'][0]), dim1D='cell' ) 
     481    SRF_lat       = lmdz.geo2point (   rprec (d_SRF_his ['lat'])+0*rprec (d_SRF_his ['lon']), dim1D='cell' ) 
     482    SRF_lon       = lmdz.geo2point ( 0*rprec (d_SRF_his ['lat'])+  rprec (d_SRF_his ['lon']), dim1D='cell' ) 
     483    SRF_aire      = lmdz.geo2point ( rprec (d_SRF_his ['Areas']) * rprec (d_SRF_his ['Contfrac']), dim1D='cell', cumulPoles=True ) 
     484    SRF_areas     = lmdz.geo2point ( rprec (d_SRF_his ['Areas'])  ,  dim1D='cell', cumulPoles=True ) 
     485    SRF_contfrac  = lmdz.geo2point ( rprec (d_SRF_his ['Contfrac']), dim1D='cell' ) 
    491486if ICO : 
    492487    if ATM_HIS == 'latlon' : 
    493         jpja, jpia = d_ATM_his['aire'][0].shape    
    494         file_ATM_aire = os.path.join ( R_IN, 'ATM', 'GRID', f'aire_{ATM}_to_{jpia}x{jpja}.nc' ) 
    495         config['Files']['file_ATM_aire'] = file_ATM_aire 
    496         echo ( f'Aire sur grille reguliere : {file_ATM_aire = }' ) 
    497         d_ATM_aire = xr.open_dataset ( file_ATM_aire, decode_times=False ).squeeze() 
    498         ATM_aire = lmdz.geo2point ( d_ATM_aire ['aire'].squeeze(), cumulPoles=True ) 
    499         ATM_fter = lmdz.geo2point ( d_ATM_his ['fract_ter'][0] ) 
    500         ATM_foce = lmdz.geo2point ( d_ATM_his ['fract_oce'][0] ) 
    501         ATM_fsic = lmdz.geo2point ( d_ATM_his ['fract_sic'][0] ) 
    502         ATM_flic = lmdz.geo2point ( d_ATM_his ['fract_lic'][0] ) 
    503         SRF_aire = lmdz.geo2point ( d_SRF_his ['Areas'] * d_SRF_his ['Contfrac'] ) 
    504         #SRF_aire = ATM_aire * lmdz.geo2point (d_SRF_his ['Contfrac'] ) 
    505         #SRF_aire = ATM_aire * ATM_fter 
     488        echo ( 'ATM areas and fractions on latlon grid' ) 
     489        if 'lat_dom_out' in d_ATM_his.variables : 
     490            ATM_lat  = lmdz.geo2point (   rprec (d_ATM_his ['lat_dom_out'])+0*rprec (d_ATM_his ['lon_dom_out']), dim1D='cell' ) 
     491            ATM_lon  = lmdz.geo2point ( 0*rprec (d_ATM_his ['lat_dom_out'])+  rprec (d_ATM_his ['lon_dom_out']), dim1D='cell' ) 
     492        else : 
     493            ATM_lat  = lmdz.geo2point (   rprec (d_ATM_his ['lat'])+0*rprec (d_ATM_his ['lon']), dim1D='cell' ) 
     494            ATM_lon  = lmdz.geo2point ( 0*rprec (d_ATM_his ['lat'])+  rprec (d_ATM_his ['lon']), dim1D='cell' ) 
     495        ATM_aire = lmdz.geo2point ( rprec (d_ATM_his ['aire'][0]).squeeze(), cumulPoles=True, dim1D='cell' ) 
     496        ATM_fter = lmdz.geo2point ( rprec (d_ATM_his ['fract_ter'][0]), dim1D='cell' ) 
     497        ATM_foce = lmdz.geo2point ( rprec (d_ATM_his ['fract_oce'][0]), dim1D='cell' ) 
     498        ATM_fsic = lmdz.geo2point ( rprec (d_ATM_his ['fract_sic'][0]), dim1D='cell' ) 
     499        ATM_flic = lmdz.geo2point ( rprec (d_ATM_his ['fract_lic'][0]), dim1D='cell' ) 
     500 
    506501    if ATM_HIS == 'ico' : 
    507         echo ( f'Aire sur grille icosaedre : {file_ATM_aire = }' ) 
    508          
    509 if LMDZ : 
    510     ATM_aire = lmdz.geo2point ( d_ATM_his ['aire'][0], cumulPoles=True ) 
    511     ATM_fter = lmdz.geo2point ( d_ATM_his ['fract_ter'][0] ) 
    512     ATM_foce = lmdz.geo2point ( d_ATM_his ['fract_oce'][0] ) 
    513     ATM_fsic = lmdz.geo2point ( d_ATM_his ['fract_sic'][0] ) 
    514     ATM_flic = lmdz.geo2point ( d_ATM_his ['fract_lic'][0] ) 
    515     #SRF_aire = lmdz.geo2point ( d_SRF_his['Areas'] * d_SRF_his['Contfrac'] ) 
    516     SRF_aire = ATM_aire * lmdz.geo2point ( d_SRF_his['Contfrac'] ) 
    517      
     502        echo ( 'ATM areas and fractions on ICO grid' ) 
     503        ATM_aire =  rprec (d_ATM_his ['aire']     [0]).squeeze() 
     504        ATM_lat  =  rprec (d_ATM_his ['lat']         ) 
     505        ATM_lon  =  rprec (d_ATM_his ['lon']         ) 
     506        ATM_fter =  rprec (d_ATM_his ['fract_ter'][0]) 
     507        ATM_foce =  rprec (d_ATM_his ['fract_oce'][0]) 
     508        ATM_fsic =  rprec (d_ATM_his ['fract_sic'][0]) 
     509        ATM_flic =  rprec (d_ATM_his ['fract_lic'][0]) 
     510 
     511    if SRF_HIS == 'latlon' : 
     512        echo ( 'SRF areas and fractions on latlon grid' ) 
     513        if 'lat_domain_landpoints_out' in d_SRF_his  :  
     514            SRF_lat  = lmdz.geo2point (   rprec (d_SRF_his ['lat_domain_landpoints_out'])+0*rprec (d_SRF_his ['lon_domain_landpoints_out']), dim1D='cell' ) 
     515            SRF_lon  = lmdz.geo2point ( 0*rprec (d_SRF_his ['lat_domain_landpoints_out'])+  rprec (d_SRF_his ['lon_domain_landpoints_out']), dim1D='cell' ) 
     516        else :  
     517            if 'lat_domain_landpoints_out' in d_SRF_his : 
     518                SRF_lat  = lmdz.geo2point (   rprec (d_SRF_his ['lat_dom_out'])+0*rprec (d_SRF_his ['lon_dom_out']), dim1D='cell' ) 
     519                SRF_lon  = lmdz.geo2point ( 0*rprec (d_SRF_his ['lat_dom_out'])+  rprec (d_SRF_his ['lon_dom_out']), dim1D='cell' ) 
     520            else : 
     521                SRF_lat  = lmdz.geo2point (   rprec (d_SRF_his ['lat'])+0*rprec (d_SRF_his ['lon']), dim1D='cell' ) 
     522                SRF_lon  = lmdz.geo2point ( 0*rprec (d_SRF_his ['lat'])+  rprec (d_SRF_his ['lon']), dim1D='cell' ) 
     523                 
     524        SRF_areas     = lmdz.geo2point ( rprec (d_SRF_his ['Areas']   )   , dim1D='cell', cumulPoles=True ) 
     525        SRF_areafrac  = lmdz.geo2point ( rprec (d_SRF_his ['AreaFrac'])   , dim1D='cell', cumulPoles=True ) 
     526        SRF_contfrac  = lmdz.geo2point ( rprec (d_SRF_his ['Contfrac'])   , dim1D='cell', cumulPoles=True ) 
     527        SRF_aire = SRF_areafrac 
     528  
     529    if SRF_HIS == 'ico' : 
     530        echo ( 'SRF areas and fractions on latlon grid' ) 
     531        SRF_lat       =  rprec (d_SRF_his ['lat']     ) 
     532        SRF_lon       =  rprec (d_SRF_his ['lon']     ) 
     533        SRF_areas     =  rprec (d_SRF_his ['Areas']   )  
     534        SRF_contfrac  =  rprec (d_SRF_his ['Contfrac']) 
     535        SRF_aire      =  SRF_areas * SRF_contfrac 
    518536ATM_fsea      = ATM_foce + ATM_fsic 
    519537ATM_flnd      = ATM_fter + ATM_flic 
     
    525543ATM_aire_fsea = ATM_aire * ATM_fsea 
    526544 
    527 SRF_aire = SRF_aire.where ( SRF_aire < 1E15, 0.) 
    528  
    529 if ICO : 
    530     # Area on icosahedron grid 
    531     file_DYN_aire = os.path.join ( R_IN, 'ATM', 'GRID', ATM+'_grid.nc' ) 
    532     d_DYN_aire = xr.open_dataset ( file_DYN_aire, decode_times=False).squeeze() 
    533     d_DYN_aire = d_DYN_aire.rename ( {'cell':'cell_mesh'} ) 
    534     DYN_aire   = d_DYN_aire['aire'] 
    535  
    536     DYN_fsea = d_DYN_aire ['fract_oce'] + d_DYN_aire ['fract_sic'] 
    537     DYN_flnd = 1.0 - DYN_fsea 
    538      
    539 if LMDZ : 
    540     # Area on lon/lat grid 
    541     DYN_aire = ATM_aire 
    542     DYN_fsea = ATM_fsea 
    543     DYN_flnd = ATM_flnd 
    544     DYN_fter = d_ATM_beg['FTER'] 
    545     DYN_flic = d_ATM_beg['FTER'] 
    546  
    547 def ATM_stock_int (stock) : 
    548     '''Integrate (* surface) stock on atmosphere grid''' 
    549     ATM_stock_int  = wu.Psum ( (stock * DYN_aire).to_masked_array().ravel() )  
    550     return ATM_stock_int 
     545#SRF_aire = SRF_aire.where ( SRF_aire < 1E15, 0.) 
     546 
     547# if ICO : 
     548#     if wu.unDefined ('file_DYN_aire') : file_DYN_aire = os.path.join ( R_IN, 'ATM', 'GRID', ATM+'_grid.nc' ) 
     549#     config['Files']['file_DYN_aire'] = file_DYN_aire 
     550 
     551# if ICO : 
     552#     # Area on icosahedron grid 
     553#     d_DYN_aire = xr.open_dataset ( file_DYN_aire, decode_times=False ).squeeze() 
     554            
     555#     DYN_lat = d_DYN_aire['lat'] 
     556#     DYN_lon = d_DYN_aire['lon'] 
     557 
     558#     DYN_aire = d_DYN_aire['aire'] 
     559#     DYN_fsea = d_DYN_aire['fract_oce'] + d_DYN_aire['fract_sic'] 
     560#     DYN_flnd = 1.0 - DYN_fsea 
     561#     DYN_fter = d_ATM_beg['FTER'] 
     562#     DYN_flic = d_ATM_beg['FLIC'] 
     563#     DYN_aire_fter = DYN_aire * DYN_fter 
     564     
     565# if LMDZ : 
     566#     # Area on lon/lat grid 
     567#     DYN_aire = ATM_aire 
     568#     DYN_fsea = ATM_fsea 
     569#     DYN_flnd = ATM_flnd 
     570#     DYN_fter = rprec (d_ATM_beg['FTER']) 
     571#     DYN_flic = rprec (d_ATM_beg['FLIC']) 
     572#     DYN_aire_fter = DYN_aire * DYN_fter 
     573 
     574# Functions computing integrals and sum 
     575# def ATM_stock_int (stock) : 
     576#     '''Integrate (* surface) stock on atmosphere grid''' 
     577#     ATM_stock_int  = wu.Psum ( (stock * DYN_aire).to_masked_array().ravel() )  
     578#     return ATM_stock_int 
    551579 
    552580def ATM_flux_int (flux) : 
     
    555583    return ATM_flux_int 
    556584 
    557 def SRF_stock_int (stock) : 
    558     '''Integrate (* surface) stock on land grid''' 
    559     ATM_stock_int  = wu.Ksum (  ( (stock * DYN_aire_fter).to_masked_array().ravel()) ) 
    560     return ATM_stock_int 
     585# def SRF_stock_int (stock) : 
     586#     '''Integrate (* surface) stock on land grid''' 
     587#     ATM_stock_int  = wu.Ksum (  ( (stock * DYN_aire_fter).to_masked_array().ravel()) ) 
     588#     return ATM_stock_int 
    561589 
    562590def SRF_flux_int (flux) : 
     
    565593    return SRF_flux_int 
    566594 
    567 def OCE_stock_int (stock) : 
    568     '''Integrate stock on ocean grid''' 
    569     OCE_stock_int = np.sum (  np.sort ( (stock * OCE_aire ).to_masked_array().ravel()) ) 
    570     return OCE_stock_int 
     595def LIC_flux_int (flux) : 
     596    '''Integrate (* time * surface) flux on land ice grid''' 
     597    LIC_flux_int  = wu.Psum ( (flux * dtime_per_sec * ATM_aire_flic).to_masked_array().ravel() ) 
     598    return LIC_flux_int 
     599 
     600# def OCE_stock_int (stock) : 
     601#     '''Integrate stock on ocean grid''' 
     602#     OCE_stock_int = np.sum (  np.sort ( (stock * OCE_aire ).to_masked_array().ravel()) ) 
     603#     return OCE_stock_int 
    571604 
    572605def ONE_stock_int (stock) : 
     
    584617    OCE_flux_int = np.sum (  np.sort ( (flux * dtime_per_sec).to_masked_array().ravel()) ) 
    585618    return OCE_flux_int 
    586      
    587 #if LMDZ : 
    588 #    d_ATM_beg = d_ATM_beg.assign ( coords={'lon':d_ATM_beg.lon*180./np.pi} ) 
    589619 
    590620# Get mask and surfaces 
     
    607637 
    608638echo ( '\n====================================================================================' ) 
    609 echo ( '-- NEMO change in stores (for the records)' ) 
    610 #-- Note that the total number of days of the run should be diagnosed rather than assumed 
    611 #-- Here the result is in Sv 
    612 # 
    613 #-- Change in ocean volume in freshwater equivalent 
    614  
    615 OCE_ssh_beg = d_OCE_beg['sshn'] 
    616 OCE_ssh_end = d_OCE_end['sshn'] 
    617 OCE_sum_ssh_beg = OCE_stock_int ( OCE_ssh_beg ) 
    618 OCE_sum_ssh_end = OCE_stock_int ( OCE_ssh_end ) 
    619  
    620 OCE_mas_wat_beg = OCE_sum_ssh_beg * OCE_rho_liq 
    621 OCE_mas_wat_end = OCE_sum_ssh_end * OCE_rho_liq 
    622  
    623 echo ( 'OCE_sum_ssh_beg = {:12.6e} m^3 | OCE_sum_ssh_end = {:12.6e} m^3'.format (OCE_sum_ssh_beg, OCE_sum_ssh_end) ) 
    624 dOCE_vol_liq = ( OCE_sum_ssh_end - OCE_sum_ssh_beg ) 
    625 dOCE_mas_liq = dOCE_vol_liq * OCE_rho_liq 
    626 dOCE_mas_wat = dOCE_mas_liq 
    627  
    628 echo ( 'dOCE vol    = {:12.3e} m^3'.format (dOCE_vol_liq) ) 
    629 echo ( 'dOCE ssh    = {:12.3e} m  '.format (dOCE_vol_liq/OCE_aire_tot) ) 
    630 echo ( 'dOCE mass   = {:12.3e} kg '.format (dOCE_mas_liq) ) 
    631 echo ( 'dOCE mass   = {:12.3e} Sv '.format (dOCE_mas_liq/dtime_sec*1E-6/OCE_rho_liq) ) 
    632  
    633 ## Glace et neige 
     639echo ( f'-- ATM Fluxes  -- {Title} ' ) 
     640 
     641if ATM_HIS == 'latlon' : 
     642    echo ( ' latlon case' ) 
     643    ATM_wbilo_oce   = lmdz.geo2point ( rprec (d_ATM_his ['wbilo_oce']), dim1D='cell' ) 
     644    ATM_wbilo_sic   = lmdz.geo2point ( rprec (d_ATM_his ['wbilo_sic']), dim1D='cell' ) 
     645    ATM_wbilo_ter   = lmdz.geo2point ( rprec (d_ATM_his ['wbilo_ter']), dim1D='cell' ) 
     646    ATM_wbilo_lic   = lmdz.geo2point ( rprec (d_ATM_his ['wbilo_lic']), dim1D='cell' ) 
     647    ATM_runofflic   = lmdz.geo2point ( rprec (d_ATM_his ['runofflic']), dim1D='cell' ) 
     648    ATM_fqcalving   = lmdz.geo2point ( rprec (d_ATM_his ['fqcalving']), dim1D='cell' ) 
     649    ATM_fqfonte     = lmdz.geo2point ( rprec (d_ATM_his ['fqfonte']  ), dim1D='cell' ) 
     650    ATM_precip      = lmdz.geo2point ( rprec (d_ATM_his ['precip']   ), dim1D='cell' ) 
     651    ATM_snowf       = lmdz.geo2point ( rprec (d_ATM_his ['snow']     ), dim1D='cell' ) 
     652    ATM_evap        = lmdz.geo2point ( rprec (d_ATM_his ['evap']     ), dim1D='cell' ) 
     653    ATM_wevap_ter   = lmdz.geo2point ( rprec (d_ATM_his ['wevap_ter']), dim1D='cell' ) 
     654    ATM_wevap_oce   = lmdz.geo2point ( rprec (d_ATM_his ['wevap_oce']), dim1D='cell' ) 
     655    ATM_wevap_lic   = lmdz.geo2point ( rprec (d_ATM_his ['wevap_lic']), dim1D='cell' ) 
     656    ATM_wevap_sic   = lmdz.geo2point ( rprec (d_ATM_his ['wevap_sic']), dim1D='cell' ) 
     657    ATM_wrain_ter   = lmdz.geo2point ( rprec (d_ATM_his ['wrain_ter']), dim1D='cell' ) 
     658    ATM_wrain_oce   = lmdz.geo2point ( rprec (d_ATM_his ['wrain_oce']), dim1D='cell' ) 
     659    ATM_wrain_lic   = lmdz.geo2point ( rprec (d_ATM_his ['wrain_lic']), dim1D='cell' ) 
     660    ATM_wrain_sic   = lmdz.geo2point ( rprec (d_ATM_his ['wrain_sic']), dim1D='cell' ) 
     661    ATM_wsnow_ter   = lmdz.geo2point ( rprec (d_ATM_his ['wsnow_ter']), dim1D='cell' ) 
     662    ATM_wsnow_oce   = lmdz.geo2point ( rprec (d_ATM_his ['wsnow_oce']), dim1D='cell' ) 
     663    ATM_wsnow_lic   = lmdz.geo2point ( rprec (d_ATM_his ['wsnow_lic']), dim1D='cell' ) 
     664    ATM_wsnow_sic   = lmdz.geo2point ( rprec (d_ATM_his ['wsnow_sic']), dim1D='cell' ) 
     665    ATM_runofflic   = lmdz.geo2point ( rprec (d_ATM_his ['runofflic']), dim1D='cell' ) 
     666    echo ( f'End of LATLON case') 
     667     
     668if ATM_HIS == 'ico' : 
     669    echo (' ico case') 
     670    ATM_wbilo_oce   = rprec (d_ATM_his ['wbilo_oce']) 
     671    ATM_wbilo_sic   = rprec (d_ATM_his ['wbilo_sic']) 
     672    ATM_wbilo_ter   = rprec (d_ATM_his ['wbilo_ter']) 
     673    ATM_wbilo_lic   = rprec (d_ATM_his ['wbilo_lic']) 
     674    ATM_runofflic   = rprec (d_ATM_his ['runofflic']) 
     675    ATM_fqcalving   = rprec (d_ATM_his ['fqcalving']) 
     676    ATM_fqfonte     = rprec (d_ATM_his ['fqfonte']  ) 
     677    ATM_precip      = rprec (d_ATM_his ['precip']   ) 
     678    ATM_snowf       = rprec (d_ATM_his ['snow']     ) 
     679    ATM_evap        = rprec (d_ATM_his ['evap']     ) 
     680    ATM_wevap_ter   = rprec (d_ATM_his ['wevap_ter']) 
     681    ATM_wevap_oce   = rprec (d_ATM_his ['wevap_oce']) 
     682    ATM_wevap_lic   = rprec (d_ATM_his ['wevap_lic']) 
     683    ATM_wevap_sic   = rprec (d_ATM_his ['wevap_sic']) 
     684    ATM_runofflic   = rprec (d_ATM_his ['runofflic']) 
     685    ATM_wevap_ter   = rprec (d_ATM_his ['wevap_ter']) 
     686    ATM_wevap_oce   = rprec (d_ATM_his ['wevap_oce']) 
     687    ATM_wevap_lic   = rprec (d_ATM_his ['wevap_lic']) 
     688    ATM_wevap_sic   = rprec (d_ATM_his ['wevap_sic']) 
     689    ATM_wrain_ter   = rprec (d_ATM_his ['wrain_ter']) 
     690    ATM_wrain_oce   = rprec (d_ATM_his ['wrain_oce']) 
     691    ATM_wrain_lic   = rprec (d_ATM_his ['wrain_lic']) 
     692    ATM_wrain_sic   = rprec (d_ATM_his ['wrain_sic']) 
     693    ATM_wsnow_ter   = rprec (d_ATM_his ['wsnow_ter']) 
     694    ATM_wsnow_oce   = rprec (d_ATM_his ['wsnow_oce']) 
     695    ATM_wsnow_lic   = rprec (d_ATM_his ['wsnow_lic']) 
     696    ATM_wsnow_sic   = rprec (d_ATM_his ['wsnow_sic']) 
     697    echo ( f'End of ico case ') 
     698 
     699 
     700     
     701echo ( 'ATM wprecip_oce' ) 
     702ATM_wprecip_oce = ATM_wrain_oce + ATM_wsnow_oce 
     703ATM_wprecip_ter = ATM_wrain_ter + ATM_wsnow_ter 
     704ATM_wprecip_sic = ATM_wrain_sic + ATM_wsnow_sic 
     705ATM_wprecip_lic = ATM_wrain_lic + ATM_wsnow_lic 
     706 
     707ATM_wbilo       = ATM_wbilo_oce   + ATM_wbilo_sic   + ATM_wbilo_ter   + ATM_wbilo_lic 
     708ATM_wevap       = ATM_wevap_oce   + ATM_wevap_sic   + ATM_wevap_ter   + ATM_wevap_lic 
     709ATM_wprecip     = ATM_wprecip_oce + ATM_wprecip_sic + ATM_wprecip_ter + ATM_wprecip_lic 
     710ATM_wsnow       = ATM_wsnow_oce   + ATM_wsnow_sic   + ATM_wsnow_ter   + ATM_wsnow_lic 
     711ATM_wrain       = ATM_wrain_oce   + ATM_wrain_sic   + ATM_wrain_ter   + ATM_wrain_lic 
     712ATM_wemp        = ATM_wevap - ATM_wprecip 
     713ATM_emp         = ATM_evap  - ATM_precip 
     714 
     715ATM_wprecip_sea = ATM_wprecip_oce + ATM_wprecip_sic 
     716ATM_wsnow_sea   = ATM_wsnow_oce   + ATM_wsnow_sic 
     717ATM_wrain_sea   = ATM_wrain_oce   + ATM_wrain_sic 
     718ATM_wbilo_sea   = ATM_wbilo_oce   + ATM_wbilo_sic 
     719ATM_wevap_sea   = ATM_wevap_sic   + ATM_wevap_oce 
     720 
     721ATM_wemp_ter    = ATM_wevap_ter - ATM_wprecip_ter 
     722ATM_wemp_oce    = ATM_wevap_oce - ATM_wprecip_oce 
     723ATM_wemp_sic    = ATM_wevap_sic - ATM_wprecip_sic 
     724ATM_wemp_lic    = ATM_wevap_lic - ATM_wprecip_lic 
     725ATM_wemp_sea    = ATM_wevap_sic - ATM_wprecip_oce 
     726 
     727if RUN_HIS == 'latlon' : 
     728    echo ( f'RUN costalflow Grille LATLON' ) 
     729    if TestInterp : 
     730        echo ( f'RUN runoff TestInterp' ) 
     731        RUN_runoff      = lmdz.geo2point ( rprec (d_RUN_his ['runoff_contfrac_interp']  )   , dim1D='cell' ) 
     732        RUN_drainage    = lmdz.geo2point ( rprec (d_RUN_his ['drainage_contfrac_interp'])   , dim1D='cell' ) 
     733    else :  
     734        echo ( f'RUN runoff' ) 
     735        RUN_runoff      = lmdz.geo2point ( rprec (d_RUN_his ['runoff']         ), dim1D='cell' ) 
     736        RUN_drainage    = lmdz.geo2point ( rprec (d_RUN_his ['drainage']       ), dim1D='cell' ) 
     737         
     738    RUN_coastalflow     = lmdz.geo2point ( rprec (d_RUN_his ['coastalflow']    ), dim1D='cell' )  
     739    RUN_riverflow       = lmdz.geo2point ( rprec (d_RUN_his ['riverflow']      ), dim1D='cell' ) 
     740    RUN_riversret       = lmdz.geo2point ( rprec (d_RUN_his ['riversret']      ), dim1D='cell' ) 
     741    RUN_coastalflow_cpl = lmdz.geo2point ( rprec (d_RUN_his ['coastalflow_cpl']), dim1D='cell' )  
     742    RUN_riverflow_cpl   = lmdz.geo2point ( rprec (d_RUN_his ['riverflow_cpl']  ), dim1D='cell' ) 
     743 
     744if RUN_HIS == 'ico' : 
     745    echo ( f'RUN costalflow Grille ICO' ) 
     746    RUN_coastalflow =  rprec (d_RUN_his ['coastalflow']) 
     747    RUN_riverflow   =  rprec (d_RUN_his ['riverflow']  ) 
     748    RUN_runoff      =  rprec (d_RUN_his ['runoff']     ) 
     749    RUN_drainage    =  rprec (d_RUN_his ['drainage']   ) 
     750    RUN_riversret   =  rprec (d_RUN_his ['riversret']  ) 
     751     
     752    RUN_coastalflow_cpl = rprec (d_RUN_his ['coastalflow_cpl']) 
     753    RUN_riverflow_cpl   = rprec (d_RUN_his ['riverflow_cpl']  ) 
     754 
     755## Correcting units of SECHIBA variables 
     756def mmd2SI ( Var ) : 
     757    '''Change unit from mm/d or m^3/s to kg/s if needed''' 
     758    if 'units' in VarT.attrs :  
     759        if VarT.attrs['units'] in ['m^3/s', 'm3/s', 'm3.s-1',] : 
     760            VarT.values = VarT.values  * ATM_rho                 ;  VarT.attrs['units'] = 'kg/s' 
     761        if VarT.attrs['units'] == 'mm/d' : 
     762            VarT.values = VarT.values  * ATM_rho * (1e-3/86400.) ;  VarT.attrs['units'] = 'kg/s' 
     763        if VarT.attrs['units'] in ['m^3', 'm3', ] : 
     764            VarT.values = VarT.values  * ATM_rho                 ;  VarT.attrs['units'] = 'kg' 
     765             
     766for var in [ 'runoff', 'drainage', 'riversret', 'coastalflow', 'riverflow', 'coastalflow_cpl', 'riverflow_cpl' ] : 
     767    VarT = locals()['RUN_' + var] 
     768    mmd2SI (VarT) 
     769 
     770#for var in ['evap', 'snowf', 'subli', 'transpir', 'rain', 'emp' ] : 
     771#    VarT = locals()['SRF_' + var] 
     772#    mmd2SI (VarT) 
     773echo ( f'RUN input' ) 
     774RUN_input  = RUN_runoff      + RUN_drainage 
     775RUN_output = RUN_coastalflow + RUN_riverflow 
     776 
     777echo ( f'ATM flw_wbilo' ) 
     778ATM_flx_wbilo       = ATM_flux_int ( ATM_wbilo      ) 
     779ATM_flx_wevap       = ATM_flux_int ( ATM_wevap      ) 
     780ATM_flx_wprecip     = ATM_flux_int ( ATM_wprecip    ) 
     781ATM_flx_wsnow       = ATM_flux_int ( ATM_wsnow      ) 
     782ATM_flx_wrain       = ATM_flux_int ( ATM_wrain      ) 
     783ATM_flx_wemp        = ATM_flux_int ( ATM_wemp       ) 
     784 
     785ATM_flx_wbilo_lic   = ATM_flux_int ( ATM_wbilo_lic  ) 
     786ATM_flx_wbilo_oce   = ATM_flux_int ( ATM_wbilo_oce  ) 
     787ATM_flx_wbilo_sea   = ATM_flux_int ( ATM_wbilo_sea  ) 
     788ATM_flx_wbilo_sic   = ATM_flux_int ( ATM_wbilo_sic  ) 
     789ATM_flx_wbilo_ter   = ATM_flux_int ( ATM_wbilo_ter  ) 
     790ATM_flx_calving     = ATM_flux_int ( ATM_fqcalving  ) 
     791ATM_flx_fqfonte     = ATM_flux_int ( ATM_fqfonte    ) 
     792 
     793LIC_flx_calving     = LIC_flux_int ( ATM_fqcalving  ) 
     794LIC_flx_fqfonte     = LIC_flux_int ( ATM_fqfonte    ) 
     795 
     796ATM_flx_precip      = ATM_flux_int ( ATM_precip     ) 
     797ATM_flx_snowf       = ATM_flux_int ( ATM_snowf      ) 
     798ATM_flx_evap        = ATM_flux_int ( ATM_evap       ) 
     799ATM_flx_runlic      = ATM_flux_int ( ATM_runofflic  ) 
     800 
     801LIC_flx_precip      = LIC_flux_int ( ATM_precip     ) 
     802LIC_flx_snowf       = LIC_flux_int ( ATM_snowf      ) 
     803LIC_flx_evap        = LIC_flux_int ( ATM_evap       ) 
     804LIC_flx_runlic      = LIC_flux_int ( ATM_runofflic  ) 
     805 
     806ATM_flx_wrain_ter   = ATM_flux_int ( ATM_wrain_ter ) 
     807ATM_flx_wrain_oce   = ATM_flux_int ( ATM_wrain_oce ) 
     808ATM_flx_wrain_lic   = ATM_flux_int ( ATM_wrain_lic ) 
     809ATM_flx_wrain_sic   = ATM_flux_int ( ATM_wrain_sic ) 
     810ATM_flx_wrain_sea   = ATM_flux_int ( ATM_wrain_sea ) 
     811 
     812ATM_flx_wsnow_ter   = ATM_flux_int ( ATM_wsnow_ter ) 
     813ATM_flx_wsnow_oce   = ATM_flux_int ( ATM_wsnow_oce ) 
     814ATM_flx_wsnow_lic   = ATM_flux_int ( ATM_wsnow_lic ) 
     815ATM_flx_wsnow_sic   = ATM_flux_int ( ATM_wsnow_sic ) 
     816ATM_flx_wsnow_sea   = ATM_flux_int ( ATM_wsnow_sea ) 
     817 
     818ATM_flx_wevap_ter   = ATM_flux_int ( ATM_wevap_ter ) 
     819ATM_flx_wevap_oce   = ATM_flux_int ( ATM_wevap_oce ) 
     820ATM_flx_wevap_lic   = ATM_flux_int ( ATM_wevap_lic ) 
     821ATM_flx_wevap_sic   = ATM_flux_int ( ATM_wevap_sic ) 
     822ATM_flx_wevap_sea   = ATM_flux_int ( ATM_wevap_sea ) 
     823ATM_flx_wprecip_lic = ATM_flux_int ( ATM_wprecip_lic ) 
     824ATM_flx_wprecip_oce = ATM_flux_int ( ATM_wprecip_oce ) 
     825ATM_flx_wprecip_sic = ATM_flux_int ( ATM_wprecip_sic ) 
     826ATM_flx_wprecip_ter = ATM_flux_int ( ATM_wprecip_ter ) 
     827ATM_flx_wprecip_sea = ATM_flux_int ( ATM_wprecip_sea ) 
     828ATM_flx_wemp_lic    = ATM_flux_int ( ATM_wemp_lic ) 
     829ATM_flx_wemp_oce    = ATM_flux_int ( ATM_wemp_oce ) 
     830ATM_flx_wemp_sic    = ATM_flux_int ( ATM_wemp_sic ) 
     831ATM_flx_wemp_ter    = ATM_flux_int ( ATM_wemp_ter ) 
     832ATM_flx_wemp_sea    = ATM_flux_int ( ATM_wemp_sea ) 
     833 
     834ATM_flx_emp          = ATM_flux_int ( ATM_emp ) 
     835 
     836RUN_flx_coastal     = ONE_flux_int ( RUN_coastalflow) 
     837RUN_flx_river       = ONE_flux_int ( RUN_riverflow  ) 
     838RUN_flx_coastal_cpl = ONE_flux_int ( RUN_coastalflow_cpl) 
     839RUN_flx_river_cpl   = ONE_flux_int ( RUN_riverflow_cpl  ) 
     840RUN_flx_drainage    = SRF_flux_int ( RUN_drainage   ) 
     841RUN_flx_riversret   = SRF_flux_int ( RUN_riversret  ) 
     842RUN_flx_runoff      = SRF_flux_int ( RUN_runoff     ) 
     843RUN_flx_input       = SRF_flux_int ( RUN_input      ) 
     844RUN_flx_output      = ONE_flux_int ( RUN_output     ) 
     845 
     846RUN_flx_bil    = ONE_flux_int ( RUN_input       - RUN_output) 
     847RUN_flx_rivcoa = ONE_flux_int ( RUN_coastalflow + RUN_riverflow) 
     848 
     849prtFlux ('wbilo_oce            ', ATM_flx_wbilo_oce     , 'f' )           
     850prtFlux ('wbilo_sic            ', ATM_flx_wbilo_sic     , 'f' )           
     851prtFlux ('wbilo_sic+oce        ', ATM_flx_wbilo_sea     , 'f' )           
     852prtFlux ('wbilo_ter            ', ATM_flx_wbilo_ter     , 'f' )           
     853prtFlux ('wbilo_lic            ', ATM_flx_wbilo_lic     , 'f' )           
     854prtFlux ('Sum wbilo_*          ', ATM_flx_wbilo         , 'f', True)   
     855prtFlux ('E-P                  ', ATM_flx_emp           , 'f', True)   
     856prtFlux ('calving              ', ATM_flx_calving       , 'f' )  
     857prtFlux ('fqfonte              ', ATM_flx_fqfonte       , 'f' )        
     858prtFlux ('precip               ', ATM_flx_precip        , 'f' )        
     859prtFlux ('snowf                ', ATM_flx_snowf         , 'f' )         
     860prtFlux ('evap                 ', ATM_flx_evap          , 'f' ) 
     861prtFlux ('runoff lic           ', ATM_flx_runlic        , 'f' ) 
     862 
     863prtFlux ('ATM_flx_wevap*       ', ATM_flx_wevap         , 'f' ) 
     864prtFlux ('ATM_flx_wrain*       ', ATM_flx_wrain         , 'f' ) 
     865prtFlux ('ATM_flx_wsnow*       ', ATM_flx_wsnow         , 'f' ) 
     866prtFlux ('ATM_flx_wprecip*     ', ATM_flx_wprecip       , 'f' ) 
     867prtFlux ('ATM_flx_wemp*        ', ATM_flx_wemp          , 'f', True ) 
     868 
     869prtFlux ('ERROR evap           ', ATM_flx_wevap   - ATM_flx_evap  , 'e', True ) 
     870prtFlux ('ERROR precip         ', ATM_flx_wprecip - ATM_flx_precip, 'e', True ) 
     871prtFlux ('ERROR snow           ', ATM_flx_wsnow   - ATM_flx_snowf , 'e', True ) 
     872prtFlux ('ERROR emp            ', ATM_flx_wemp    - ATM_flx_emp   , 'e', True ) 
     873 
     874 
     875echo ( '\n====================================================================================' ) 
     876echo ( f'-- RUNOFF Fluxes  -- {Title} ' ) 
     877prtFlux ('coastalflow   ', RUN_flx_coastal    , 'f' )  
     878prtFlux ('riverflow     ', RUN_flx_river      , 'f' )         
     879prtFlux ('coastal_cpl   ', RUN_flx_coastal_cpl, 'f' )   
     880prtFlux ('riverf_cpl    ', RUN_flx_river_cpl  , 'f' )     
     881prtFlux ('river+coastal ', RUN_flx_rivcoa     , 'f' )    
     882prtFlux ('drainage      ', RUN_flx_drainage   , 'f' )    
     883prtFlux ('riversret     ', RUN_flx_riversret  , 'f' )    
     884prtFlux ('runoff        ', RUN_flx_runoff     , 'f' )    
     885prtFlux ('river in      ', RUN_flx_input      , 'f' )    
     886prtFlux ('river out     ', RUN_flx_output     , 'f' )    
     887prtFlux ('river bil     ', RUN_flx_bil        , 'f' )  
     888     
     889echo ( '\n====================================================================================' ) 
     890echo ( f'-- OCE Fluxes  -- {Title} ' ) 
     891 
     892# Read variable and computes integral over space and time 
     893OCE_empmr      = rprec (d_OCE_his['wfo']     )    ; OCE_mas_empmr    = OCE_flux_int ( OCE_empmr    ) 
     894OCE_wfob       = rprec (d_OCE_his['wfob']    )    ; OCE_mas_wfob     = OCE_flux_int ( OCE_wfob     ) 
     895OCE_emp_oce    = rprec (d_OCE_his['emp_oce'] )    ; OCE_mas_emp_oce  = OCE_flux_int ( OCE_emp_oce  ) 
     896OCE_emp_ice    = rprec (d_OCE_his['emp_ice'] )    ; OCE_mas_emp_ice  = OCE_flux_int ( OCE_emp_ice  ) 
     897OCE_iceshelf   = rprec (d_OCE_his['iceshelf'])    ; OCE_mas_iceshelf = OCE_flux_int ( OCE_iceshelf ) 
     898OCE_calving    = rprec (d_OCE_his['calving'] )    ; OCE_mas_calving  = OCE_flux_int ( OCE_calving  ) 
     899OCE_iceberg    = rprec (d_OCE_his['iceberg'] )    ; OCE_mas_iceberg  = OCE_flux_int ( OCE_iceberg  ) 
     900OCE_friver     = rprec (d_OCE_his['friver']  )    ; OCE_mas_friver   = OCE_flux_int ( OCE_friver   ) 
     901OCE_runoffs    = rprec (d_OCE_his['runoffs'] )    ; OCE_mas_runoffs  = OCE_flux_int ( OCE_runoffs  ) 
     902if NEMO == 4.0 or NEMO == 4.2 : 
     903    OCE_wfxice     = rprec (d_OCE_his['vfxice']) ; OCE_mas_wfxice   = OCE_flux_int ( OCE_wfxice ) 
     904    OCE_wfxsnw     = rprec (d_OCE_his['vfxsnw']) ; OCE_mas_wfxsnw   = OCE_flux_int ( OCE_wfxsnw ) 
     905    OCE_wfxsub     = rprec (d_OCE_his['vfxsub']) ; OCE_mas_wfxsub   = OCE_flux_int ( OCE_wfxsub ) 
    634906if NEMO == 3.6 : 
    635     ICE_ice_beg = d_ICE_beg['v_i_htc1']+d_ICE_beg['v_i_htc2']+d_ICE_beg['v_i_htc3']+d_ICE_beg['v_i_htc4']+d_ICE_beg['v_i_htc5'] 
    636     ICE_ice_end = d_ICE_end['v_i_htc1']+d_ICE_end['v_i_htc2']+d_ICE_end['v_i_htc3']+d_ICE_end['v_i_htc4']+d_ICE_end['v_i_htc5'] 
    637  
    638     ICE_sno_beg = d_ICE_beg['v_s_htc1']+d_ICE_beg['v_s_htc2']+d_ICE_beg['v_s_htc3']+d_ICE_beg['v_s_htc4']+d_ICE_beg['v_s_htc5'] 
    639     ICE_sno_end = d_ICE_end['v_s_htc1']+d_ICE_end['v_s_htc2']+d_ICE_end['v_s_htc3']+d_ICE_end['v_s_htc4']+d_ICE_end['v_s_htc5'] 
    640      
    641     ICE_pnd_beg = 0.0 ; ICE_pnd_end = 0.0 
    642     ICE_fzl_beg = 0.0 ; ICE_fzl_end = 0.0 
    643  
    644     ICE_mas_wat_beg = OCE_stock_int ( (ICE_ice_beg*ICE_rho_ice + ICE_sno_beg*ICE_rho_sno) ) 
    645     ICE_mas_wat_end = OCE_stock_int ( (ICE_ice_end*ICE_rho_ice + ICE_sno_end*ICE_rho_sno) ) 
    646      
     907    OCE_wfxice     = rprec (d_OCE_his['vfxice'])/86400.*ICE_rho_ice ; OCE_mas_wfxice   = OCE_flux_int ( OCE_wfxice ) 
     908    OCE_wfxsnw     = rprec (d_OCE_his['vfxsnw'])/86400.*ICE_rho_sno ; OCE_mas_wfxsnw   = OCE_flux_int ( OCE_wfxsnw ) 
     909    OCE_wfxsub     = rprec (d_OCE_his['vfxsub'])/86400.*ICE_rho_sno ; OCE_mas_wfxsub   = OCE_flux_int ( OCE_wfxsub ) 
     910# Additional checks 
     911OCE_evap_oce   = rprec (d_OCE_his['evap_ao_cea']) ; OCE_mas_evap_oce   = OCE_flux_int ( OCE_evap_oce ) 
     912ICE_evap_ice   = rprec (d_OCE_his['subl_ai_cea']) ; ICE_mas_evap_ice   = OCE_flux_int ( ICE_evap_ice ) 
     913OCE_snow_oce   = rprec (d_OCE_his['snow_ao_cea']) ; OCE_mas_snow_oce   = OCE_flux_int ( OCE_snow_oce ) 
     914OCE_snow_ice   = rprec (d_OCE_his['snow_ai_cea']) ; OCE_mas_snow_ice   = OCE_flux_int ( OCE_snow_ice ) 
     915OCE_rain       = rprec (d_OCE_his['rain']       ) ; OCE_mas_rain       = OCE_flux_int ( OCE_rain     ) 
     916ICE_wfxsub_err = rprec (d_ICE_his['vfxsub_err'] ) ; ICE_mas_wfxsub_err = OCE_flux_int ( ICE_wfxsub_err ) 
    647917if NEMO == 4.0 or NEMO == 4.2 : 
    648     ICE_ice_beg = d_ICE_beg ['v_i']  ; ICE_ice_end = d_ICE_end ['v_i'] 
    649     ICE_sno_beg = d_ICE_beg ['v_s']  ; ICE_sno_end = d_ICE_end ['v_s'] 
    650     ICE_pnd_beg = d_ICE_beg ['v_ip'] ; ICE_pnd_end = d_ICE_end ['v_ip'] 
    651     ICE_fzl_beg = d_ICE_beg ['v_il'] ; ICE_fzl_end = d_ICE_end ['v_il'] 
    652      
    653     ICE_mas_wat_beg = OCE_stock_int ( d_ICE_beg['snwice_mass'] ) 
    654     ICE_mas_wat_end = OCE_stock_int ( d_ICE_end['snwice_mass'] ) 
    655      
    656      
    657 ICE_vol_ice_beg = OCE_stock_int ( ICE_ice_beg ) 
    658 ICE_vol_ice_end = OCE_stock_int ( ICE_ice_end ) 
    659  
    660 ICE_vol_sno_beg = OCE_stock_int ( ICE_sno_beg ) 
    661 ICE_vol_sno_end = OCE_stock_int ( ICE_sno_end ) 
    662  
    663 ICE_vol_pnd_beg = OCE_stock_int ( ICE_pnd_beg ) 
    664 ICE_vol_pnd_end = OCE_stock_int ( ICE_pnd_end ) 
    665  
    666 ICE_vol_fzl_beg = OCE_stock_int ( ICE_fzl_beg ) 
    667 ICE_vol_fzl_end = OCE_stock_int ( ICE_fzl_end ) 
    668  
    669 #-- Converting to freswater volume 
    670 dICE_vol_ice = ICE_vol_ice_end - ICE_vol_ice_beg 
    671 dICE_mas_ice = dICE_vol_ice * ICE_rho_ice 
    672  
    673 dICE_vol_sno = ICE_vol_sno_end - ICE_vol_sno_beg 
    674 dICE_mas_sno = dICE_vol_sno * ICE_rho_sno 
    675  
    676 dICE_vol_pnd = ICE_vol_pnd_end - ICE_vol_pnd_beg 
    677 dICE_mas_pnd = dICE_vol_pnd * ICE_rho_pnd 
    678  
    679 dICE_vol_fzl= ICE_vol_fzl_end - ICE_vol_fzl_beg 
    680 dICE_mas_fzl = dICE_vol_fzl * ICE_rho_pnd 
    681  
     918    ICE_wfxpnd     = rprec (d_ICE_his['vfxpnd']    ) ; ICE_mas_wfxpnd     = OCE_flux_int ( ICE_wfxpnd     ) 
     919    ICE_wfxsnw_sub = rprec (d_ICE_his['vfxsnw_sub']) ; ICE_mas_wfxsnw_sub = OCE_flux_int ( ICE_wfxsnw_sub ) 
     920    ICE_wfxsnw_pre = rprec (d_ICE_his['vfxsnw_pre']) ; ICE_mas_wfxsnw_pre = OCE_flux_int ( ICE_wfxsnw_pre ) 
    682921if NEMO == 3.6 : 
    683     dICE_mas_wat = dICE_mas_ice + dICE_mas_sno 
    684     dSEA_mas_wat = dOCE_mas_wat + dICE_mas_ice + dICE_mas_sno 
    685  
    686 if NEMO == 4.0 or NEMO == 4.2 : 
    687     dICE_mas_wat = ICE_mas_wat_end - ICE_mas_wat_beg 
    688     dSEA_mas_wat = dOCE_mas_wat + dICE_mas_wat 
    689  
    690 echo ( f'ICE_vol_ice_beg = {ICE_vol_ice_beg:12.6e} m^3 | ICE_vol_ice_end = {ICE_vol_ice_end:12.6e} m^3' ) 
    691 echo ( f'ICE_vol_sno_beg = {ICE_vol_sno_beg:12.6e} m^3 | ICE_vol_sno_end = {ICE_vol_sno_end:12.6e} m^3' ) 
    692 echo ( f'ICE_vol_pnd_beg = {ICE_vol_pnd_beg:12.6e} m^3 | ICE_vol_pnd_end = {ICE_vol_pnd_end:12.6e} m^3' ) 
    693 echo ( f'ICE_vol_fzl_beg = {ICE_vol_fzl_beg:12.6e} m^3 | ICE_vol_fzl_end = {ICE_vol_fzl_end:12.6e} m^3' ) 
    694  
    695 echo ( f'dICE_vol_ice   = {dICE_vol_ice:12.3e} m^3' ) 
    696 echo ( f'dICE_vol_sno   = {dICE_vol_sno:12.3e} m^3' ) 
    697 echo ( f'dICE_vol_pnd   = {dICE_vol_pnd:12.3e} m^3' ) 
    698 echo ( f'dICE_mas_ice   = {dICE_mas_ice:12.3e} m^3' ) 
    699 echo ( f'dICE_mas_sno   = {dICE_mas_sno:12.3e} m^3' )   
    700 echo ( f'dICE_mas_pnd   = {dICE_mas_pnd:12.3e} m^3' )   
    701 echo ( f'dICE_mas_fzl   = {dICE_mas_fzl:12.3e} m^3' )   
    702 echo ( f'dICE_mas_wat   = {dICE_mas_wat:12.3e} m^3' )  
    703  
    704  
    705 SEA_mas_wat_beg = OCE_mas_wat_beg + ICE_mas_wat_beg 
    706 SEA_mas_wat_end = OCE_mas_wat_end + ICE_mas_wat_end 
    707  
    708 echo ( '\n------------------------------------------------------------') 
    709 echo ( 'Variation du contenu en eau ocean + glace ' ) 
    710 echo ( 'dMass (ocean)   = {:12.6e} kg '.format(dSEA_mas_wat) ) 
    711 echo ( 'dVol  (ocean)   = {:12.3e} Sv '.format(dSEA_mas_wat/dtime_sec*1E-6/OCE_rho_liq) ) 
    712 echo ( 'dVol  (ocean)   = {:12.3e} m  '.format(dSEA_mas_wat*1E-3/OCE_aire_tot) ) 
    713  
    714  
    715 echo ( '\n------------------------------------------------------------------------------------' ) 
    716 echo ( '-- ATM changes in stores ' ) 
    717  
    718 #-- Change in precipitable water from the atmosphere daily and monthly files 
    719 #-- Compute sum weighted by gridcell area (kg/m2) then convert to Sv 
    720  
    721 # ATM vertical grid 
    722 ATM_Ahyb = d_ATM_his['Ahyb'].squeeze() 
    723 ATM_Bhyb = d_ATM_his['Bhyb'].squeeze() 
    724 klevp1 = ATM_Ahyb.shape[0] 
    725  
    726 # Surface pressure 
    727 if ICO :  
    728     DYN_ps_beg = d_DYN_beg['ps'] 
    729     DYN_ps_end = d_DYN_end['ps'] 
    730      
    731 if LMDZ :  
    732     DYN_ps_beg =  lmdz.geo2point ( d_DYN_beg['ps'].isel(rlonv=slice(0,-1)) ) 
    733     DYN_ps_end =  lmdz.geo2point ( d_DYN_end['ps'].isel(rlonv=slice(0,-1)) ) 
    734      
    735 # 3D Pressure 
    736 DYN_p_beg = ATM_Ahyb + ATM_Bhyb * DYN_ps_beg 
    737 DYN_p_end = ATM_Ahyb + ATM_Bhyb * DYN_ps_end 
    738  
    739 # Layer thickness 
    740 DYN_sigma_beg = DYN_p_beg[0:-1]*0. 
    741 DYN_sigma_end = DYN_p_end[0:-1]*0.  
    742  
    743 for k in np.arange (klevp1-1) : 
    744     DYN_sigma_beg[k,:] = (DYN_p_beg[k,:] - DYN_p_beg[k+1,:]) / Grav 
    745     DYN_sigma_end[k,:] = (DYN_p_end[k,:] - DYN_p_end[k+1,:]) / Grav 
    746  
    747 DYN_sigma_beg = DYN_sigma_beg.rename ( {'klevp1':'sigs'} ) 
    748 DYN_sigma_end = DYN_sigma_end.rename ( {'klevp1':'sigs'} ) 
    749  
    750 ##-- Vertical and horizontal integral, and sum of liquid, solid and vapor water phases 
    751 if LMDZ : 
    752     try :  
    753         DYN_wat_beg = lmdz.geo3point ( (d_DYN_beg['H2Ov'] + d_DYN_beg['H2Ol'] + d_DYN_beg['H2Oi']).isel(rlonv=slice(0,-1) ) ) 
    754         DYN_wat_end = lmdz.geo3point ( (d_DYN_end['H2Ov'] + d_DYN_end['H2Ol'] + d_DYN_end['H2Oi']).isel(rlonv=slice(0,-1) ) ) 
    755     except : 
    756         DYN_wat_beg = lmdz.geo3point ( (d_DYN_beg['H2O_g'] + d_DYN_beg['H2O_l'] + d_DYN_beg['H2O_s']).isel(rlonv=slice(0,-1) ) ) 
    757         DYN_wat_end = lmdz.geo3point ( (d_DYN_end['H2O_g'] + d_DYN_end['H2O_l'] + d_DYN_end['H2O_s']).isel(rlonv=slice(0,-1) ) ) 
    758 if ICO : 
    759     try : 
    760         DYN_wat_beg = (d_DYN_beg['H2O_g'] + d_DYN_beg['H2O_l'] + d_DYN_beg['H2O_s']).rename ( {'lev':'sigs'} ) 
    761         DYN_wat_end = (d_DYN_end['H2O_g'] + d_DYN_end['H2O_l'] + d_DYN_end['H2O_s']).rename ( {'lev':'sigs'} ) 
    762     except :  
    763         DYN_wat_beg = (d_DYN_beg['q'].isel(nq=0) + d_DYN_beg['q'].isel(nq=1) + d_DYN_beg['q'].isel(nq=2) ).rename ( {'lev':'sigs'} ) 
    764         DYN_wat_end = (d_DYN_end['q'].isel(nq=0) + d_DYN_end['q'].isel(nq=1) + d_DYN_end['q'].isel(nq=2) ).rename ( {'lev':'sigs'} ) 
    765      
    766 DYN_mas_wat_beg = ATM_stock_int (DYN_sigma_beg * DYN_wat_beg) 
    767 DYN_mas_wat_end = ATM_stock_int (DYN_sigma_end * DYN_wat_end) 
    768  
    769 dDYN_mas_wat = DYN_mas_wat_end - DYN_mas_wat_beg 
    770  
    771 echo ( '\nVariation du contenu en eau atmosphere (dynamique) ' ) 
    772 echo ( 'DYN_mas_beg = {:12.6e} kg | DYN_mas_end = {:12.6e} kg'.format (DYN_mas_wat_beg, DYN_mas_wat_end) ) 
    773 echo ( 'dMass (atm)   = {:12.3e} kg '.format (dDYN_mas_wat) ) 
    774 echo ( 'dMass (atm)   = {:12.3e} Sv '.format (dDYN_mas_wat/dtime_sec*1.e-6/ATM_rho) ) 
    775 echo ( 'dMass (atm)   = {:12.3e} m  '.format (dDYN_mas_wat/ATM_aire_sea_tot/ATM_rho) ) 
    776  
    777 ATM_sno_beg = d_ATM_beg['SNOW01']*d_ATM_beg['FTER']+d_ATM_beg['SNOW02']*d_ATM_beg['FLIC']+d_ATM_beg['SNOW03']*d_ATM_beg['FOCE']+d_ATM_beg['SNOW04']*d_ATM_beg['FSIC'] 
    778 ATM_sno_end = d_ATM_end['SNOW01']*d_ATM_end['FTER']+d_ATM_end['SNOW02']*d_ATM_end['FLIC']+d_ATM_end['SNOW03']*d_ATM_end['FOCE']+d_ATM_end['SNOW04']*d_ATM_end['FSIC'] 
    779  
    780 ATM_qs_beg  = d_ATM_beg['QS01']*d_ATM_beg['FTER']+d_ATM_beg['QS02']*d_ATM_beg['FLIC']+d_ATM_beg['QS03']*d_ATM_beg['FOCE']+d_ATM_beg['QS04']*d_ATM_beg['FSIC'] 
    781 ATM_qs_end  = d_ATM_end['QS01']*d_ATM_end['FTER']+d_ATM_end['QS02']*d_ATM_end['FLIC']+d_ATM_end['QS03']*d_ATM_end['FOCE']+d_ATM_end['QS04']*d_ATM_end['FSIC'] 
    782  
    783 ATM_qsol_beg = d_ATM_beg['QSOL'] 
    784 ATM_qsol_end = d_ATM_end['QSOL'] 
    785  
    786 ATM_qs01_beg  = d_ATM_beg['QS01'] * d_ATM_beg['FTER'] 
    787 ATM_qs01_end  = d_ATM_end['QS01'] * d_ATM_end['FTER'] 
    788 ATM_qs02_beg  = d_ATM_beg['QS02'] * d_ATM_beg['FLIC'] 
    789 ATM_qs02_end  = d_ATM_end['QS02'] * d_ATM_end['FLIC'] 
    790 ATM_qs03_beg  = d_ATM_beg['QS03'] * d_ATM_beg['FOCE'] 
    791 ATM_qs03_end  = d_ATM_end['QS03'] * d_ATM_end['FOCE'] 
    792 ATM_qs04_beg  = d_ATM_beg['QS04'] * d_ATM_beg['FSIC'] 
    793 ATM_qs04_end  = d_ATM_end['QS04'] * d_ATM_end['FSIC']   
    794  
    795 if ICO : 
    796    ATM_sno_beg   = ATM_sno_beg .rename ( {'points_physiques':'cell_mesh'} ) 
    797    ATM_sno_end   = ATM_sno_end .rename ( {'points_physiques':'cell_mesh'} ) 
    798    ATM_qs_beg    = ATM_qs_beg  .rename ( {'points_physiques':'cell_mesh'} ) 
    799    ATM_qs_end    = ATM_qs_end  .rename ( {'points_physiques':'cell_mesh'} ) 
    800    ATM_qsol_beg  = ATM_qsol_beg.rename ( {'points_physiques':'cell_mesh'} ) 
    801    ATM_qsol_end  = ATM_qsol_end.rename ( {'points_physiques':'cell_mesh'} ) 
    802    ATM_qs01_beg  = ATM_qs01_beg.rename ( {'points_physiques':'cell_mesh'} ) 
    803    ATM_qs01_end  = ATM_qs01_end.rename ( {'points_physiques':'cell_mesh'} ) 
    804    ATM_qs02_beg  = ATM_qs02_beg.rename ( {'points_physiques':'cell_mesh'} ) 
    805    ATM_qs02_end  = ATM_qs02_end.rename ( {'points_physiques':'cell_mesh'} ) 
    806    ATM_qs03_beg  = ATM_qs03_beg.rename ( {'points_physiques':'cell_mesh'} ) 
    807    ATM_qs03_end  = ATM_qs03_end.rename ( {'points_physiques':'cell_mesh'} ) 
    808    ATM_qs04_beg  = ATM_qs04_beg.rename ( {'points_physiques':'cell_mesh'} ) 
    809    ATM_qs04_end  = ATM_qs04_end.rename ( {'points_physiques':'cell_mesh'} )  
    810  
    811 echo ('Computing atmosphere integrals') 
    812 ATM_mas_sno_beg   = ATM_stock_int ( ATM_sno_beg  ) 
    813 ATM_mas_sno_end   = ATM_stock_int ( ATM_sno_end  ) 
    814 ATM_mas_qs_beg    = ATM_stock_int ( ATM_qs_beg   ) 
    815 ATM_mas_qs_end    = ATM_stock_int ( ATM_qs_end   ) 
    816 ATM_mas_qsol_beg  = ATM_stock_int ( ATM_qsol_beg ) 
    817 ATM_mas_qsol_end  = ATM_stock_int ( ATM_qsol_end ) 
    818 ATM_mas_qs01_beg  = ATM_stock_int ( ATM_qs01_beg ) 
    819 ATM_mas_qs01_end  = ATM_stock_int ( ATM_qs01_end ) 
    820 ATM_mas_qs02_beg  = ATM_stock_int ( ATM_qs02_beg ) 
    821 ATM_mas_qs02_end  = ATM_stock_int ( ATM_qs02_end ) 
    822 ATM_mas_qs03_beg  = ATM_stock_int ( ATM_qs03_beg ) 
    823 ATM_mas_qs03_end  = ATM_stock_int ( ATM_qs03_end ) 
    824 ATM_mas_qs04_beg  = ATM_stock_int ( ATM_qs04_beg ) 
    825 ATM_mas_qs04_end  = ATM_stock_int ( ATM_qs04_end ) 
    826  
    827 dATM_mas_sno  = ATM_mas_sno_end  - ATM_mas_sno_beg 
    828 dATM_mas_qs   = ATM_mas_qs_end   - ATM_mas_qs_beg 
    829 dATM_mas_qsol = ATM_mas_qsol_end - ATM_mas_qsol_beg 
    830  
    831 dATM_mas_qs01 = ATM_mas_qs01_end - ATM_mas_qs01_beg 
    832 dATM_mas_qs02 = ATM_mas_qs02_end - ATM_mas_qs02_beg 
    833 dATM_mas_qs03 = ATM_mas_qs03_end - ATM_mas_qs03_beg 
    834 dATM_mas_qs04 = ATM_mas_qs04_end - ATM_mas_qs04_beg 
    835  
    836 echo ( '\nVariation du contenu en neige atmosphere (calottes)' ) 
    837 echo ( 'ATM_mas_sno_beg  = {:12.6e} kg | ATM_mas_sno_end  = {:12.6e} kg'.format (ATM_mas_sno_beg, ATM_mas_sno_end) ) 
    838 echo ( 'dMass (neige atm) = {:12.3e} kg '.format (dATM_mas_sno ) ) 
    839 echo ( 'dMass (neige atm) = {:12.3e} Sv '.format (dATM_mas_sno/dtime_sec*1e-6/ICE_rho_ice) ) 
    840 echo ( 'dMass (neige atm) = {:12.3e} m  '.format (dATM_mas_sno/ATM_aire_sea_tot/ATM_rho) ) 
    841  
    842 echo ( '\nVariation du contenu humidite du sol' ) 
    843 echo ( 'ATM_mas_qs_beg  = {:12.6e} kg | ATM_mas_qs_end  = {:12.6e} kg'.format (ATM_mas_qs_beg, ATM_mas_qs_end) ) 
    844 echo ( 'dMass (neige atm) = {:12.3e} kg '.format (dATM_mas_qs ) ) 
    845 echo ( 'dMass (neige atm) = {:12.3e} Sv '.format (dATM_mas_qs/dtime_sec*1e-6/ATM_rho) ) 
    846 echo ( 'dMass (neige atm) = {:12.3e} m  '.format (dATM_mas_qs/ATM_aire_sea_tot/ATM_rho) ) 
    847  
    848 echo ( '\nVariation du contenu en eau+neige atmosphere ' ) 
    849 echo ( 'dMass (eau + neige atm) = {:12.3e} kg '.format (  dDYN_mas_wat + dATM_mas_sno) ) 
    850 echo ( 'dMass (eau + neige atm) = {:12.3e} Sv '.format ( (dDYN_mas_wat + dATM_mas_sno)/dtime_sec*1E-6/ATM_rho) ) 
    851 echo ( 'dMass (eau + neige atm) = {:12.3e} m  '.format ( (dDYN_mas_wat + dATM_mas_sno)/ATM_aire_sea_tot/ATM_rho) ) 
    852  
    853 echo ( '\n------------------------------------------------------------------------------------' ) 
    854 echo ( '-- SRF changes ' ) 
    855  
    856 if Routing == 'SIMPLE' : 
    857     RUN_mas_wat_beg = ONE_stock_int ( d_RUN_beg ['fast_reservoir'] +  d_RUN_beg ['slow_reservoir'] +  d_RUN_beg ['stream_reservoir']) 
    858     RUN_mas_wat_end = ONE_stock_int ( d_RUN_end ['fast_reservoir'] +  d_RUN_end ['slow_reservoir'] +  d_RUN_end ['stream_reservoir']) 
    859  
    860 if Routing == 'SECHIBA' :  
    861     RUN_mas_wat_beg = ONE_stock_int ( d_SRF_beg['fastres']  + d_SRF_beg['slowres'] + d_SRF_beg['streamres'] \ 
    862                                     + d_SRF_beg['floodres'] + d_SRF_beg['lakeres'] + d_SRF_beg['pondres'] ) 
    863     RUN_mas_wat_end = ONE_stock_int ( d_SRF_end['fastres']  + d_SRF_end['slowres'] + d_SRF_end['streamres'] \ 
    864                                     + d_SRF_end['floodres'] + d_SRF_end['lakeres'] + d_SRF_end['pondres'] ) 
    865  
    866 dRUN_mas_wat = RUN_mas_wat_end - RUN_mas_wat_beg 
    867      
    868 echo ( '\nWater content in routing ' ) 
    869 echo ( 'RUN_mas_wat_beg = {:12.6e} kg | RUN_mas_wat_end = {:12.6e} kg '.format (RUN_mas_wat_end, RUN_mas_wat_end) ) 
    870 echo ( 'dMass (routing)  = {:12.3e} kg '.format(dRUN_mas_wat) ) 
    871 echo ( 'dMass (routing)  = {:12.3e} Sv '.format(dRUN_mas_wat/dtime_sec*1E-9) ) 
    872 echo ( 'dMass (routing)  = {:12.3e} m  '.format(dRUN_mas_wat/OCE_aire_tot*1E-3) ) 
    873  
    874 print ('Reading SRF restart') 
    875 tot_watveg_beg  = d_SRF_beg['tot_watveg_beg']  ; tot_watveg_beg  = tot_watveg_beg .where (tot_watveg_beg < 1E10, 0.) 
    876 tot_watsoil_beg = d_SRF_beg['tot_watsoil_beg'] ; tot_watsoil_beg = tot_watsoil_beg.where (tot_watsoil_beg< 1E10, 0.) 
    877 snow_beg        = d_SRF_beg['snow_beg']        ; snow_beg        = snow_beg       .where (snow_beg       < 1E10, 0.) 
    878  
    879 tot_watveg_end  = d_SRF_end['tot_watveg_beg']  ; tot_watveg_end  = tot_watveg_end .where (tot_watveg_end < 1E10, 0.) 
    880 tot_watsoil_end = d_SRF_end['tot_watsoil_beg'] ; tot_watsoil_end = tot_watsoil_end.where (tot_watsoil_end< 1E10, 0.) 
    881 snow_end        = d_SRF_end['snow_beg']        ; snow_end        = snow_end       .where (snow_end       < 1E10, 0.) 
    882  
    883 if LMDZ : 
    884     tot_watveg_beg  = lmdz.geo2point (tot_watveg_beg) 
    885     tot_watsoil_beg = lmdz.geo2point (tot_watsoil_beg) 
    886     snow_beg        = lmdz.geo2point (snow_beg) 
    887     tot_watveg_end  = lmdz.geo2point (tot_watveg_end) 
    888     tot_watsoil_end = lmdz.geo2point (tot_watsoil_end) 
    889     snow_end        = lmdz.geo2point (snow_end) 
    890  
    891 SRF_wat_beg = tot_watveg_beg + tot_watsoil_beg + snow_beg 
    892 SRF_wat_end = tot_watveg_end + tot_watsoil_end + snow_end 
    893  
    894 #SRF_mas_wat_beg = d_SRF_beg['tot_watveg_beg']+d_SRF_beg['tot_watsoil_beg'] + d_SRF_beg['snow_beg'] 
    895 #SRF_mas_wat_end = d_SRF_end['tot_watveg_beg']+d_SRF_end['tot_watsoil_beg'] + d_SRF_end['snow_beg'] 
    896  
    897 #if LMDZ : 
    898 #    tot_watveg_beg  = tot_watveg_beg .rename ( {'y':'points_phyiques'} ) 
    899 #    tot_watsoil_beg = tot_watsoil_beg.rename ( {'y':'points_phyiques'} ) 
    900 #    snow_beg        = snow_beg       .rename ( {'y':'points_phyiques'} ) 
    901 #    tot_watveg_end  = tot_watveg_end .rename ( {'y':'points_phyiques'} ) 
    902 #    tot_watsoil_end = tot_watsoil_end.rename ( {'y':'points_phyiques'} ) 
    903 #    snow_end        = snow_end       .rename ( {'y':'points_phyiques'} ) 
    904 #    SRF_wat_beg     = SRF_wat_beg    .rename ( {'y':'points_phyiques'} ) 
    905 #    SRF_wat_end     = SRF_wat_end    .rename ( {'y':'points_phyiques'} ) 
    906 if ICO : 
    907     tot_watveg_beg  = tot_watveg_beg .rename ( {'y':'cell_mesh'} ) 
    908     tot_watsoil_beg = tot_watsoil_beg.rename ( {'y':'cell_mesh'} ) 
    909     snow_beg        = snow_beg       .rename ( {'y':'cell_mesh'} ) 
    910     tot_watveg_end  = tot_watveg_end .rename ( {'y':'cell_mesh'} ) 
    911     tot_watsoil_end = tot_watsoil_end.rename ( {'y':'cell_mesh'} ) 
    912     snow_end        = snow_end       .rename ( {'y':'cell_mesh'} ) 
    913     SRF_wat_beg     = SRF_wat_beg    .rename ( {'y':'cell_mesh'} ) 
    914     SRF_wat_end     = SRF_wat_end    .rename ( {'y':'cell_mesh'} )   
    915  
    916 print ('Computing integrals') 
    917  
    918 print ( ' 1/6', end='' ) ; sys.stdout.flush () 
    919 SRF_mas_watveg_beg   = ATM_stock_int ( tot_watveg_beg  ) 
    920 print ( ' 2/6', end='' ) ; sys.stdout.flush () 
    921 SRF_mas_watsoil_beg  = ATM_stock_int ( tot_watsoil_beg ) 
    922 print ( ' 3/6', end='' ) ; sys.stdout.flush () 
    923 SRF_mas_snow_beg     = ATM_stock_int ( snow_beg        ) 
    924 print ( ' 4/6', end='' ) ; sys.stdout.flush () 
    925 SRF_mas_watveg_end   = ATM_stock_int ( tot_watveg_end  ) 
    926 print ( ' 5/6', end='' ) ; sys.stdout.flush () 
    927 SRF_mas_watsoil_end  = ATM_stock_int ( tot_watsoil_end ) 
    928 print ( ' 6/6', end='' ) ; sys.stdout.flush () 
    929 SRF_mas_snow_end     = ATM_stock_int ( snow_end        ) 
    930 print (' -- ') ; sys.stdout.flush () 
    931  
    932 dSRF_mas_watveg   = SRF_mas_watveg_end   - SRF_mas_watveg_beg 
    933 dSRF_mas_watsoil  = SRF_mas_watsoil_end  - SRF_mas_watsoil_beg 
    934 dSRF_mas_snow     = SRF_mas_snow_end     - SRF_mas_snow_beg 
    935  
    936 echo ('\nLes differents reservoirs') 
    937 echo ( f'SRF_mas_watveg_beg   = {SRF_mas_watveg_beg :12.6e} kg | SRF_mas_watveg_end   = {SRF_mas_watveg_end :12.6e} kg ' ) 
    938 echo ( f'SRF_mas_watsoil_beg  = {SRF_mas_watsoil_beg:12.6e} kg | SRF_mas_watsoil_end  = {SRF_mas_watsoil_end:12.6e} kg ' ) 
    939 echo ( f'SRF_mas_snow_beg     = {SRF_mas_snow_beg   :12.6e} kg | SRF_mas_snow_end     = {SRF_mas_snow_end   :12.6e} kg ' ) 
    940  
    941 echo ( 'dMass (watveg)  = {:12.3e} kg | {:12.2e} Sv | {:12.2e} m '.format (dSRF_mas_watveg , dSRF_mas_watveg /dtime_sec*1E-9, dSRF_mas_watveg /OCE_aire_tot*1E-3) ) 
    942 echo ( 'dMass (watsoil) = {:12.3e} kg | {:12.2e} Sv | {:12.2e} m '.format (dSRF_mas_watsoil, dSRF_mas_watsoil/dtime_sec*1E-9, dSRF_mas_watsoil/OCE_aire_tot*1E-3) ) 
    943 echo ( 'dMass (sno)     = {:12.3e} kg | {:12.2e} Sv | {:12.2e} m '.format (dSRF_mas_snow   , dSRF_mas_snow   /dtime_sec*1E-9, dSRF_mas_snow   /OCE_aire_tot*1E-3  ) ) 
    944  
    945 SRF_mas_wat_beg = SRF_mas_watveg_beg + SRF_mas_watsoil_beg + SRF_mas_snow_beg  
    946 SRF_mas_wat_end = SRF_mas_watveg_end + SRF_mas_watsoil_end + SRF_mas_snow_end 
    947 dSRF_mas_wat = SRF_mas_wat_end - SRF_mas_wat_beg 
    948  
    949 echo ( '\nWater content in surface ' ) 
    950 echo ( 'SRF_mas_wat_beg  = {:12.6e} kg | SRF_mas_wat_end  = {:12.6e} kg '.format (SRF_mas_wat_beg, SRF_mas_wat_end) ) 
    951 echo ( 'dMass (water srf) = {:12.3e} kg '.format (dSRF_mas_wat) ) 
    952 echo ( 'dMass (water srf) = {:12.3e} Sv '.format (dSRF_mas_wat/dtime_sec*1E-6/ATM_rho) ) 
    953 echo ( 'dMass (water srf) = {:12.3e} m  '.format (dSRF_mas_wat/ATM_aire_sea_tot/ATM_rho) ) 
    954  
    955 echo ( '\nWater content in  ATM + SRF + RUN ' ) 
    956 echo ( 'mas_wat_beg = {:12.6e} kg | mas_wat_end = {:12.6e} kg '. 
    957            format (DYN_mas_wat_beg + ATM_mas_sno_beg + RUN_mas_wat_beg + SRF_mas_wat_beg, 
    958                    DYN_mas_wat_end + ATM_mas_sno_end + RUN_mas_wat_end + SRF_mas_wat_end) ) 
    959 echo ( 'dMass (water atm+srf+run) = {:12.6e} kg '.format ( dDYN_mas_wat + dATM_mas_sno + dRUN_mas_wat + dSRF_mas_wat) ) 
    960 echo ( 'dMass (water atm+srf+run) = {:12.3e} Sv '.format ((dDYN_mas_wat + dATM_mas_sno + dRUN_mas_wat + dSRF_mas_wat)/dtime_sec*1E-6/ATM_rho) ) 
    961 echo ( 'dMass (water atm+srf+run) = {:12.3e} m  '.format ((dDYN_mas_wat + dATM_mas_sno + dRUN_mas_wat + dSRF_mas_wat)/ATM_aire_sea_tot/ATM_rho) ) 
    962  
    963 echo ( '\n------------------------------------------------------------------------------------' ) 
    964 echo ( '-- Change in all components' ) 
    965 echo ( 'mas_wat_beg = {:12.6e} kg | mas_wat_end = {:12.6e} kg'. 
    966            format (SEA_mas_wat_beg + DYN_mas_wat_beg + ATM_mas_sno_beg + RUN_mas_wat_beg + SRF_mas_wat_beg, 
    967                    SEA_mas_wat_end + DYN_mas_wat_end + ATM_mas_sno_end + RUN_mas_wat_end + SRF_mas_wat_end) ) 
    968 echo ( 'dMass (water CPL)         = {:12.3e} kg '.format ( dSEA_mas_wat + dDYN_mas_wat + dATM_mas_sno + dRUN_mas_wat + dSRF_mas_wat) ) 
    969 echo ( 'dMass (water CPL)         = {:12.3e} Sv '.format ((dSEA_mas_wat + dDYN_mas_wat + dATM_mas_sno + dRUN_mas_wat + dSRF_mas_wat)/dtime_sec*1E-9) ) 
    970 echo ( 'dMass (water CPL)         = {:12.3e} m  '.format ((dSEA_mas_wat + dDYN_mas_wat + dATM_mas_sno + dRUN_mas_wat + dSRF_mas_wat)/OCE_aire_tot*1E-3) ) 
    971  
    972  
     922    ICE_wfxpnd = 0.0 ; ICE_mas_wfxpnd = 0.0 
     923    ICE_wfxsnw_sub = rprec (d_ICE_his['vfxsub'])/86400.*ICE_rho_sno  ; ICE_mas_wfxsnw_sub = OCE_flux_int ( ICE_wfxsnw_sub ) 
     924    ICE_wfxsnw_pre = rprec (d_ICE_his['vfxspr'])/86400.*ICE_rho_sno  ; ICE_mas_wfxsnw_pre = OCE_flux_int ( ICE_wfxsnw_pre     ) 
     925 
     926OCE_wfcorr    = rprec (d_OCE_his['wfcorr']) ; OCE_mas_wfcorr  = OCE_flux_int ( OCE_wfcorr ) 
     927if OCE_relax  : 
     928    # ssr and fwb are included in emp=>empmr but not in emp_oce (outputed by sea-ice) 
     929    OCE_vflx_fwb = rprec (d_OCE_his['vflx_fwb']) ; OCE_mas_vflx_fwb   = OCE_flux_int ( OCE_vflx_fwb ) 
     930    OCE_vflx_ssr = rprec (d_OCE_his['vflx_ssr']) ; OCE_mas_vflx_ssr   = OCE_flux_int ( OCE_vflx_ssr ) 
     931else :  
     932    OCE_fwb = 0.0 ; OCE_mas_fwb = 0.0 
     933    OCE_ssr = 0.0 ; OCE_mas_ssr = 0.0 
     934if OCE_icb : 
     935    OCE_berg_icb    = rprec (d_OCE_his['berg_floating_melt']) ; OCE_mas_berg_icb = OCE_flux_int ( OCE_berg_icb    ) 
     936    OCE_calving_icb = rprec (d_OCE_his['calving_icb']       ) ; OCE_mas_calv_icb = OCE_flux_int ( OCE_calving_icb ) 
     937else : 
     938    OCE_berg_icb = 0. ; OCE_mas_berg_icb = 0. 
     939    OCE_calv_icb = 0. ; OCE_mas_calv_icb = 0. 
     940 
     941OCE_mas_emp = OCE_mas_emp_oce - OCE_mas_wfxice  - OCE_mas_wfxsnw  - ICE_mas_wfxpnd - ICE_mas_wfxsub_err 
     942OCE_mas_all = OCE_mas_emp_oce + OCE_mas_emp_ice - OCE_mas_runoffs - OCE_mas_iceshelf 
     943 
     944prtFlux ('OCE+ICE budget ', OCE_mas_all       , 'e', True) 
     945prtFlux ('  EMPMR        ', OCE_mas_empmr     , 'e', True) 
     946prtFlux ('  WFOB         ', OCE_mas_wfob      , 'e', True) 
     947prtFlux ('  EMP_OCE      ', OCE_mas_emp_oce   , 'e', True) 
     948prtFlux ('  EMP_ICE      ', OCE_mas_emp_ice   , 'e', True) 
     949prtFlux ('  EMP          ', OCE_mas_emp       , 'e', True) 
     950prtFlux ('  ICEBERG      ', OCE_mas_iceberg   , 'e',     ) 
     951prtFlux ('  ICESHELF     ', OCE_mas_iceshelf  , 'e', True) 
     952prtFlux ('  CALVING      ', OCE_mas_calving   , 'e', True) 
     953prtFlux ('  FRIVER       ', OCE_mas_friver    , 'e',     )   
     954prtFlux ('  RUNOFFS      ', OCE_mas_runoffs   , 'e', True) 
     955prtFlux ('  WFXICE       ', OCE_mas_wfxice    , 'e', True) 
     956prtFlux ('  WFXSNW       ', OCE_mas_wfxsnw    , 'e', True) 
     957prtFlux ('  WFXSUB       ', OCE_mas_wfxsub    , 'e', True) 
     958prtFlux ('  WFXPND       ', ICE_mas_wfxpnd    , 'e', True) 
     959prtFlux ('  WFXSNW_SUB   ', ICE_mas_wfxsnw_sub, 'e', True) 
     960prtFlux ('  WFXSNW_PRE   ', ICE_mas_wfxsnw_pre, 'e', True) 
     961prtFlux ('  WFXSUB_ERR   ', ICE_mas_wfxsub_err, 'e', True) 
     962prtFlux ('  EVAP_OCE     ', OCE_mas_evap_oce  , 'e'      ) 
     963prtFlux ('  EVAP_ICE     ', ICE_mas_evap_ice  , 'e', True) 
     964prtFlux ('  SNOW_OCE     ', OCE_mas_snow_oce  , 'e', True) 
     965prtFlux ('  SNOW_ICE     ', OCE_mas_snow_ice  , 'e', True) 
     966prtFlux ('  RAIN         ', OCE_mas_rain      , 'e'      ) 
     967prtFlux ('  FWB          ', OCE_mas_fwb       , 'e', True) 
     968prtFlux ('  SSR          ', OCE_mas_ssr       , 'e', True) 
     969prtFlux ('  WFCORR       ', OCE_mas_wfcorr    , 'e', True) 
     970prtFlux ('  BERG_ICB     ', OCE_mas_berg_icb  , 'e', True) 
     971prtFlux ('  CALV_ICB     ', OCE_mas_calv_icb  , 'e', True) 
     972 
     973 
     974echo (' ') 
     975 
     976prtFlux ( 'wbilo sea  ', ATM_flux_int (ATM_wbilo_sea), 'e',   ) 
     977prtFlux ( 'costalflow ', ONE_flux_int (RUN_coastalflow), 'e',   ) 
     978prtFlux ( 'riverflow  ', RUN_flx_river  , 'e',   ) 
     979prtFlux ( 'costalflow ', RUN_flx_coastal, 'e',   ) 
     980prtFlux ( 'runoff     ', RUN_flx_river+RUN_flx_coastal, 'e',   ) 
     981 
     982ATM_to_OCE   =  ATM_flux_int (ATM_wbilo_sea) - RUN_flx_river - RUN_flx_coastal - ATM_flx_calving 
     983#OCE_from_ATM = -OCE_mas_emp_oce - OCE_mas_emp_ice + OCE_mas_runoffs + OCE_mas_iceberg + OCE_mas_calving + OCE_mas_iceshelf 
     984OCE_from_ATM = OCE_mas_all 
     985 
     986prtFlux ( 'ATM_to_OCE  ', ATM_to_OCE  , 'e', True ) 
     987prtFlux ( 'OCE_from_ATM', OCE_from_ATM, 'e', True ) 
Note: See TracChangeset for help on using the changeset viewer.