Ignore:
Timestamp:
06/13/23 12:58:38 (13 months ago)
Author:
omamce
Message:

WaterUtils?.pyVersion qui marche pour :
Water Budget
O.M.

Version qui marche pour :

  • Grille LMDZ et routage SECHIBA
  • Grille ICO avec sorties natives et routage SIMPLE : routage pas très précis.

Ne marche pas pour :

  • Grille LMDZ et routage SIMPLE : pb sur runoff
  • Grille ICO avec sorties interpolées :

# Erreurs relatives

### VALID-CM622-LR.01 - LMDZ : OK ? Sauf LIC

  • LIC : 1.e-2
  • SRF : 4.e-6
  • SRF/ATM : 2e-10
  • RUNOFF : 1.5e-4

### VALID-CM622-SIMPLE-ROUTING - LMDZ : Erreur RUNOFF, LIC

  • LIC : 1.6
  • SRF : 1e-6
  • SRF/ATM : 1.e-10
  • RUNOFF : -7

### TEST-CM72-SIMPLE-ROUTING.13 - ICO : Erreur SRF, RUNOFF, LIC

  • LIC : 150
  • SRF : 0.5
  • SRF/ATM : 4e-2
  • RUNOFF : 700

### CM71v420-LR-pd-02.ini - ICO interpolé : Erreur SRF, RUNOFF, LIC

  • LIC : 15
  • SRF : 0.7
  • SRF/ATM : -5.e-2
  • ROUTING : 3e3

### CM71v420-LR-pd-02.ini - ICO natif : Erreurs faibles RUNOFF, LIC

  • LIC : 0.3
  • SRF : 7.e-6
  • SRF/ATM : -6.e-9
  • ROUTING : 5.e-2
File:
1 edited

Legend:

Unmodified
Added
Removed
  • TOOLS/WATER_BUDGET/OCE_waterbudget.py

    r6277 r6508  
    2424import numpy as np 
    2525import configparser, re 
    26  
    27 ## Creates parser 
     26from pathlib import Path 
     27 
     28## Import local module 
     29import WaterUtils as wu 
     30 
     31# Check python version 
     32if sys.version_info < (3, 8, 0) : 
     33    print ( f'Python version : {platform.python_version()}' )  
     34    raise Exception ( "Minimum Python version is 3.8" ) 
     35 
     36## Creates parser for reading .ini input file 
    2837config = configparser.ConfigParser() 
    2938config.optionxform = str # To keep capitals 
     
    3342 
    3443## 
    35 ARCHIVE=None ; STORAGE = None ; SCRATCHDIR=None ; R_IN=None ; rebuild=None 
    36 TmpDir=None ; FileOut=None ; dir_ATM_his=None ; dir_SRF_his=None ; dir_OCE_his=None ; dir_ICE_his=None ; FileCommon=None 
     44ARCHIVE=None ; STORAGE = None ; SCRATCHDIR=None ; R_IN=None ; rebuild='rebuild_nemo' 
     45TmpDir=None ; RunDir=None ; FileOut=None ; dir_ATM_his=None ; dir_SRF_his=None ; dir_OCE_his=None ; dir_ICE_his=None ; FileCommon=None 
    3746file_ATM_his=None ; file_SRF_his=None ; file_RUN_his=None ; file_OCE_his=None ;  file_ICE_his=None ; file_OCE_sca=None  
    38 file_restart_beg=None ; file_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 
     47tar_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 
    3948file_RUN_beg=None ; file_RUN_end=None ; file_OCE_beg=None ; file_ICE_beg=None ; file_OCE_end=None ; file_ICE_end=None 
    40  
    41 # Arguments passed 
     49ContinueOnError=False ; ErrorCount=0 
     50tar_restart_beg_ATM=None ; tar_restart_beg_DYN=None ; tar_restart_beg_SRF=None ; tar_restart_beg_RUN=None ; tar_restart_beg_OCE=None ; tar_restart_beg_ICE=None 
     51tar_restart_end_ATM=None ; tar_restart_end_DYN=None ; tar_restart_end_SRF=None ; tar_restart_end_RUN=None ; tar_restart_end_OCE=None ; tar_restart_end_ICE=None 
     52 
     53# Read command line arguments 
    4254print ( "Name of Python script:", sys.argv[0] ) 
    4355IniFile = sys.argv[1] 
     56# Text existence of IniFile 
     57print ("Input file : ", IniFile ) 
     58 
     59if 'full' in IniFile : FullIniFile = IniFile 
     60else                 : FullIniFile = 'full_' + IniFile 
     61 
    4462print ("Input file : ", IniFile ) 
    4563config.read (IniFile) 
    46 if 'full' in IniFile : FullIniFile = IniFile 
    47 else                 : FullIniFile = 'full_' + IniFile 
    48  
    49 def setBool (chars) : 
    50     '''Convert specific char string in boolean if possible''' 
    51     setBool = chars 
    52     for key in configparser.ConfigParser.BOOLEAN_STATES.keys () : 
    53         if chars.lower() == key : setBool = configparser.ConfigParser.BOOLEAN_STATES[key] 
    54     return setBool 
    55  
    56 def setNum (chars) : 
    57     '''Convert specific char string in integer or real if possible''' 
    58     if type (chars) == str : 
    59         realnum = re.compile ("^[-+]?[0-9]*\.?[0-9]+(e[-+]?[0-9]+)?$") 
    60         isReal = realnum.match(chars.strip()) != None 
    61         isInt  = chars.strip().isdigit() 
    62         if isReal : 
    63             if isInt : setNum = int   (chars) 
    64             else     : setNum = float (chars) 
    65         else : setNum = chars 
    66     else : setNum = chars 
    67     return setNum 
    68  
    69 def setNone (chars) : 
    70     '''Convert specific char string to None if possible''' 
    71     if type (chars) == str : 
    72         if chars in ['None', 'NONE', 'none'] : setNone = None 
    73         else : setNone = chars 
    74     else : setNone = chars 
    75     return setNone 
    76  
    77 ## Reading config 
     64FullIniFile = 'full_' + IniFile 
     65     
     66## Reading config file 
    7867for Section in ['Experiment', 'libIGCM', 'Files', 'Physics' ] : 
    79     if Section in config.keys() :  
    80         print ( f'[{Section}]' ) 
     68   if Section in config.keys () :  
     69        print ( f'Reading [{Section}]' ) 
    8170        for VarName in config[Section].keys() : 
    8271            locals()[VarName] = config[Section][VarName] 
    83             locals()[VarName] = setBool (locals()[VarName]) 
    84             locals()[VarName] = setNum  (locals()[VarName]) 
     72            exec ( f'{VarName} = wu.setBool ({VarName})' ) 
     73            exec ( f'{VarName} = wu.setNum  ({VarName})' ) 
     74            exec ( f'{VarName} = wu.setNone ({VarName})' ) 
     75            exec ( f'wu.{VarName} = {VarName}' ) 
    8576            print ( '{:25} set to : {:}'.format (VarName, locals()[VarName]) ) 
    86  
     77            #exec ( f'del {VarName}' ) 
     78 
     79#-- Some physical constants 
     80if wu.unDefined ( 'Ra' )           : Ra          = 6366197.7236758135 #-- Earth Radius (m) 
     81if wu.unDefined ( 'Grav' )         : Grav        = 9.81               #-- Gravity (m^2/s 
     82if wu.unDefined ( 'ICE_rho_ice' )  : ICE_rho_ice = 917.0              #-- Ice volumic mass (kg/m3) in LIM3 
     83if wu.unDefined ( 'ICE_rho_sno')   : ICE_rho_sno = 330.0              #-- Snow volumic mass (kg/m3) in LIM3 
     84if wu.unDefined ( 'OCE_rho_liq' )  : OCE_rho_liq = 1026.0             #-- Ocean water volumic mass (kg/m3) in NEMO 
     85if wu.unDefined ( 'ATM_rho' )      : ATM_rho     = 1000.0             #-- Water volumic mass in atmosphere (kg/m^3) 
     86if wu.unDefined ( 'SRF_rho' )      : SRF_rho     = 1000.0             #-- Water volumic mass in surface reservoir (kg/m^3) 
     87if wu.unDefined ( 'RUN_rho' )      : RUN_rho     = 1000.0             #-- Water volumic mass of rivers (kg/m^3) 
     88if wu.unDefined ( 'ICE_rho_pnd' )  : ICE_rho_pnd = 1000.              #-- Water volumic mass in ice ponds (kg/m^3) 
     89if wu.unDefined ( 'YearLength' )   : YearLength  = 365.25 * 24. * 60. * 60. #-- Year length (s) 
     90 
     91# Set libIGCM and machine dependant values 
    8792if not 'Files' in config.keys() : config['Files'] = {} 
    88  
    89 def unDefined (char) : 
    90     if char in globals () : 
    91         if char == None : return True 
    92         else : return False 
    93     else : return True 
    94  
    95 ##-- Some physical constants 
    96 #-- Earth Radius 
    97 if not 'Ra'            in locals () : Ra = 6366197.7236758135 
    98 #-- Gravity 
    99 if not 'Grav'          in locals () : Grav = 9.81 
    100 #-- Ice volumic mass (kg/m3) in LIM3 
    101 if not 'ICE_rho_ice'   in locals () : ICE_rho_ice = 917.0 
    102 #-- Snow volumic mass (kg/m3) in LIM3 
    103 if not 'ICE_rho_sno'   in locals () : ICE_rho_sno = 330.0 
    104     #-- Water density in ice pounds in SI3 
    105 if not 'ICE_rho_pnd'   in locals () : ICE_rho_pnd = 1000. 
    106 #-- Ocean water volumic mass (kg/m3) in NEMO 
    107 if not 'OCE_rho_liq'   in locals () : OCE_rho_liq = 1026. 
    108 #-- Water volumic mass in atmosphere 
    109 if not 'ATM_rho'       in locals () : ATM_rho = 1000. 
    110 #-- Water volumic mass in surface reservoirs 
    111 if not 'SRF_rho'       in locals () : SRF_rho = 1000. 
    112 #-- Water volumic mass of rivers 
    113 if not 'RUN_rho'       in locals () : RUN_rho = 1000. 
    114 #-- Year length 
    115 if not 'YearLength'    in locals () : YearLength = 365.25 * 24. * 60. * 60. 
    116  
    117 config['Physics'] = { 'Ra':Ra, 'Grav':Grav, 'ICE_rho_ice':ICE_rho_ice, 'ICE_rho_sno':ICE_rho_sno, 'OCE_rho_liq':OCE_rho_liq, 'ICE_rho_pnd':ICE_rho_pnd, 
    118                           'ATM_rho':ATM_rho, 'SRF_rho':SRF_rho, 'RUN_rho':RUN_rho} 
     93     
     94config['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} 
    11995         
    120  
    121  
    122 # Where do we run ? 
    123 SysName, NodeName, Release, Version, Machine = os.uname() 
    124 TGCC  = ( 'irene'   in NodeName ) 
    125 IDRIS = ( 'jeanzay' in NodeName ) 
    126  
    127 ## Set site specific libIGCM directories, and other specific stuff 
    128 if TGCC : 
    129     CPU = subprocess.getoutput ( 'lscpu | grep "Model name"' ) 
    130     if "Intel(R) Xeon(R) Platinum" in CPU : Machine = 'irene' 
    131     if "AMD"                       in CPU : Machine = 'irene-amd' 
    132          
    133     ARCHIVE     = subprocess.getoutput ( f'ccc_home --cccstore   -d {Project} -u {User}' ) 
    134     STORAGE     = subprocess.getoutput ( f'ccc_home --cccwork    -d {Project} -u {User}' ) 
    135     SCRATCHDIR  = subprocess.getoutput ( f'ccc_home --cccscratch -d {Project} -u {User}' ) 
    136     R_IN        = os.path.join ( subprocess.getoutput ( f'ccc_home --cccwork -d igcmg -u igcmg'), 'IGCM') 
    137     rebuild     = os.path.join ( subprocess.getoutput ( f'ccc_home --ccchome -d igcmg -u igcmg'), 'Tools', Machine, 'rebuild_nemo', 'bin', 'rebuild_nemo' ) 
    138  
    139     ## Specific to run at TGCC. 
    140     # Needed before importing a NetCDF library (netCDF4, xarray, cmds, etc ...) 
    141     import mpi4py 
    142     mpi4py.rc.initialize = False 
    143          
    144     ## Creates output directory 
    145     TmpDir = os.path.join ( subprocess.getoutput ( 'ccc_home --cccscratch' ), f'WATER_{JobName}_{YearBegin}_{YearEnd}' ) 
    146  
    147 if IDRIS : 
    148     raise Exception ("Pour IDRIS : repertoires et chemins a definir")  
    149  
    150 config['System'] = {'SysName':SysName, 'NodeName':NodeName, 'Release':Release, 'Version':Version,'Machine':Machine, 'TGCC':TGCC,'IDRIS':IDRIS, 'CPU':CPU, 
    151                     'Program'  : "Generated by : " + str(sys.argv),  
    152                     'HOSTNAME' : platform.node (), 'LOGNAME'  : os.getlogin (), 
    153                     'Python'   : f'{platform.python_version ()}', 
    154                     'OS'       : f'{platform.system ()} release : {platform.release ()} hardware : {platform.machine ()}', 
    155                     'SVN_Author'   : "$Author$",  
    156                     'SVN_Date'     : "$Date$", 
    157                     'SVN_Revision' : "$Revision$", 
    158                     'SVN_Id'       : "$Id$", 
    159                     'SVN_HeadURL'  : "$HeadURL$"} 
     96with open ('SetLibIGCM.py') as f: exec ( f.read() ) 
     97config['Files']['TmpDir'] = TmpDir 
    16098 
    16199if libIGCM : 
     
    167105import xarray as xr 
    168106     
    169 # Output file 
    170 if FileOut == None :  
    171     FileOut = f'OCE_waterbudget_{JobName}_{YearBegin}_{YearEnd}.out' 
    172     config['Files']['FileOut'] = FileOut 
     107# Output file with water budget diagnostics 
     108if wu.unDefined ( 'FileOut' ) : FileOut = f'OCE_waterbudget_{JobName}_{YearBegin}_{YearEnd}.out' 
     109config['Files']['FileOut'] = FileOut 
    173110 
    174111f_out = open ( FileOut, mode = 'w' ) 
    175      
    176 # Function to print to stdout *and* output file 
     112 
     113# Useful functions 
     114def kg2Sv    (val, rho=ATM_rho) : 
     115    '''From kg to Sverdrup''' 
     116    return val/dtime_sec*1.0e-6/rho 
     117 
     118def kg2myear (val, rho=ATM_rho) : 
     119    '''From kg to m/year''' 
     120    return val/ATM_aire_sea_tot/rho/NbYear 
     121 
     122def var2prt (var, small=False, rho=ATM_rho) : 
     123    if small :  return var , kg2Sv(var, rho=rho)*1000., kg2myear(var, rho=rho)*1000. 
     124    else     :  return var , kg2Sv(var, rho=rho)      , kg2myear(var, rho=rho) 
     125 
     126def prtFlux (Desc, var, Form='F', small=False, rho=ATM_rho, width=15) : 
     127    if small : 
     128        if Form in ['f', 'F'] : ff=" {:12.4e} kg | {:12.4f} mSv | {:12.4f} mm/year " 
     129        if Form in ['e', 'E'] : ff=" {:12.4e} kg | {:12.4e} mSv | {:12.4e} mm/year " 
     130    else : 
     131        if Form in ['f', 'F'] : ff=" {:12.4e} kg | {:12.4f} Sv  | {:12.4f} m/year  " 
     132        if Form in ['e', 'E'] : ff=" {:12.4e} kg | {:12.4e} Sv  | {:12.4e} m/year  " 
     133    echo ( (' {:>{width}} = ' +ff).format (Desc, *var2prt(var, small, rho=rho), width=width ) ) 
     134    return None 
     135 
    177136def echo (string, end='\n') : 
     137    '''Function to print to stdout *and* output file''' 
    178138    print ( str(string), end=end  ) 
    179139    sys.stdout.flush () 
     
    182142    return None 
    183143     
    184 ## Set libIGCM directories 
    185 R_OUT       = os.path.join ( ARCHIVE   , 'IGCM_OUT') 
    186 R_BUF       = os.path.join ( SCRATCHDIR, 'IGCM_OUT') 
    187  
    188 L_EXP = os.path.join (TagName, SpaceName, ExperimentName, JobName) 
    189 R_SAVE      = os.path.join ( R_OUT, L_EXP ) 
    190 R_BUFR      = os.path.join ( R_BUF, L_EXP ) 
    191 POST_DIR    = os.path.join ( R_BUF, L_EXP, 'Out' ) 
    192 REBUILD_DIR = os.path.join ( R_BUF, L_EXP, 'REBUILD' ) 
    193 R_BUF_KSH   = os.path.join ( R_BUFR, 'Out' ) 
    194 R_FIGR      = os.path.join ( STORAGE, 'IGCM_OUT', L_EXP ) 
    195      
    196 #if os.path.isdir (TmpDir) : shutil.rmtree ( TmpDir ) 
    197 if not os.path.isdir (TmpDir) : os.mkdir (TmpDir) 
    198 TmpDirOCE = os.path.join (TmpDir, 'OCE') 
    199 TmpDirICE = os.path.join (TmpDir, 'ICE') 
    200 if not os.path.exists (TmpDirOCE) : os.mkdir (TmpDirOCE ) 
    201 if not os.path.exists (TmpDirICE) : os.mkdir (TmpDirICE ) 
     144### Set libIGCM directories 
     145if wu.unDefined ('R_OUT'      ) : R_OUT       = os.path.join ( ARCHIVE   , 'IGCM_OUT' ) 
     146if wu.unDefined ('R_BUF'      ) : R_BUF       = os.path.join ( SCRATCHDIR, 'IGCM_OUT' ) 
     147if wu.unDefined ('L_EXP'      ) : L_EXP       = os.path.join (TagName, SpaceName, ExperimentName, JobName) 
     148if wu.unDefined ('R_SAVE'     ) : R_SAVE      = os.path.join ( R_OUT, L_EXP ) 
     149if wu.unDefined ('R_BUFR'     ) : R_BUFR      = os.path.join ( R_BUF, L_EXP ) 
     150if wu.unDefined ('POST_DIR'   ) : POST_DIR    = os.path.join ( R_BUFR, 'Out' ) 
     151if wu.unDefined ('REBUILD_DIR') : REBUILD_DIR = os.path.join ( R_BUFR, 'REBUILD' ) 
     152if wu.unDefined ('R_BUF_KSH'  ) : R_BUF_KSH   = os.path.join ( R_BUFR, 'Out' ) 
     153if wu.unDefined ('R_FIGR'     ) : R_FIGR      = os.path.join ( STORAGE, 'IGCM_OUT', L_EXP ) 
     154 
     155config['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 } 
     156 
     157# Set directory to extract files 
     158if wu.unDefined ( 'RunDir' ) : RunDir = os.path.join ( TmpDir, f'WATER_{JobName}_{YearBegin}_{YearEnd}' ) 
     159config['Files']['RunDir'] = RunDir 
     160 
     161if not os.path.isdir (RunDir) : os.makedirs (RunDir) 
     162 
     163# Set directories to rebuild ocean and ice restart files 
     164RunDirOCE = os.path.join (RunDir, 'OCE') 
     165RunDirICE = os.path.join (RunDir, 'ICE') 
     166if not os.path.exists (RunDirOCE) : os.mkdir (RunDirOCE ) 
     167if not os.path.exists (RunDirICE) : os.mkdir (RunDirICE ) 
    202168 
    203169echo (' ') 
    204 echo ( f'JobName : {JobName}' ) 
    205 echo (Comment) 
    206 echo ( f'Working in TMPDIR : {TmpDir}' ) 
    207  
    208 echo ( f'\nDealing with {L_EXP}' ) 
    209  
    210 #-- Model output directories 
    211 if Freq == "MO" : FreqDir =  os.path.join ('Output' , 'MO' ) 
    212 if Freq == "SE" : FreqDir =  os.path.join ('Analyse', 'SE' ) 
    213 if dir_OCE_his == None : 
     170echo ( f'JobName   : {JobName}'   ) 
     171echo ( f'Comment   : {Comment}'   ) 
     172echo ( f'TmpDir    : {TmpDir}'    ) 
     173echo ( f'RunDirOCE : {RunDirOCE}' ) 
     174echo ( f'RunDirICE : {RunDirICE}' ) 
     175 
     176echo ( f'\nDealing with {L_EXP}'  ) 
     177 
     178#-- Creates model output directory names 
     179if Freq == "MO" : FreqDir = os.path.join ( 'Output' , 'MO' ) 
     180if Freq == "SE" : FreqDir = os.path.join ( 'Analyse', 'SE' ) 
     181if wu.unDefined ( 'dir_OCE_his' ) : 
    214182    dir_OCE_his = os.path.join ( R_SAVE, "OCE", FreqDir ) 
    215183    config['Files']['dir_OCE_his'] = dir_OCE_his 
    216 if dir_ICE_his == None : 
     184if wu.unDefined ( 'dir_ICE_his' ) : 
    217185    dir_ICE_his = os.path.join ( R_SAVE, "ICE", FreqDir ) 
    218186    config['Files']['dir_OCE_his'] = dir_OCE_his 
     
    222190echo ( f'{dir_ICE_his}' ) 
    223191 
    224 #-- Files Names 
    225 if Period == None : 
     192#-- Creates files names 
     193if wu.unDefined ( 'Period ' ) : 
    226194    if Freq == 'MO' : Period = f'{YearBegin}0101_{YearEnd}1231_1M' 
    227195    if Freq == 'SE' : Period = f'SE_{YearBegin}0101_{YearEnd}1231_1M' 
    228196    config['Files']['Period'] = Period 
    229 if FileCommon == None : 
     197if wu.unDefined ( 'FileCommon' ) : 
    230198    FileCommon = f'{JobName}_{Period}' 
    231199    config['Files']['FileCommon'] = FileCommon 
    232200 
    233 if Title == None : 
     201if wu.unDefined ( 'Title' ) : 
    234202    Title = f'{JobName} : {Freq} : {YearBegin}-01-01 - {YearEnd}-12-31' 
    235203    config['Files']['Title'] = Title 
     
    237205         
    238206echo ('\nOpen history files' ) 
    239 if file_OCE_his == None : 
     207if wu.unDefined ('file_OCE_his' ) : 
    240208    file_OCE_his = os.path.join ( dir_OCE_his, f'{FileCommon}_grid_T.nc' ) 
    241209    file_OCE_his = file_OCE_his 
    242 if file_OCE_sca == None :     
     210if wu.unDefined ('file_OCE_sca' ) :     
    243211    file_OCE_sca = os.path.join ( dir_OCE_his, f'{FileCommon}_scalar.nc' ) 
    244212    config['Files']['file_OCE_sca'] = file_OCE_sca 
    245 if file_ICE_his == None :  
     213if wu.unDefined ( 'file_ICE_hi' ) :  
    246214    file_ICE_his = os.path.join ( dir_ICE_his, f'{FileCommon}_icemod.nc' ) 
    247215    config['Files']['file_ICE_his'] = file_ICE_his 
     
    258226## Compute run length 
    259227dtime = ( d_OCE_his.time_counter_bounds.max() - d_OCE_his.time_counter_bounds.min() ) 
    260 echo ('\nRun length : {:8.2f} days'.format ( (dtime/np.timedelta64(1, "D")).values ) ) 
     228echo ( f'\nRun length : {(dtime/np.timedelta64(1, "D")).values:8.2f} days' ) 
    261229dtime_sec = (dtime/np.timedelta64(1, "s")).values.item() # Convert in seconds 
    262230 
    263231## Compute length of each period 
    264232dtime_per = ( d_OCE_his.time_counter_bounds[:,-1] - d_OCE_his.time_counter_bounds[:,0] ) 
    265 echo ('\nPeriods lengths (days) : ') 
    266 echo (' {:}'.format ( (dtime_per/np.timedelta64(1, "D")).values ) ) 
     233echo ( f'\nPeriods lengths (days) : ') 
     234echo ( f' {(dtime_per/np.timedelta64(1, "D")).values}' ) 
    267235dtime_per_sec = (dtime_per/np.timedelta64(1, "s")).values # In seconds 
    268236dtime_per_sec = xr.DataArray (dtime_per_sec, dims=["time_counter", ], coords=[d_OCE_his.time_counter,] ) 
     
    271239## Number of years 
    272240NbYear = dtime_sec / YearLength 
     241 
    273242#-- Open restart files 
    274243YearRes = YearBegin - 1              # Year of the restart of beginning of simulation 
     
    277246echo (f'Restart dates - Start : {YearRes}-12-31  /  End : {YearEnd}-12-31 ') 
    278247 
    279 if TarRestartPeriod_beg == None :  
     248if wu.unDefined ( 'TarRestartPeriod_beg' ) :  
    280249    echo (f'Restart dates - Start : {YearRes}-12-31  /  End : {YearEnd}-12-31 ') 
    281250    TarRestartPeriod_beg = f'{YearPre}0101_{YearRes}1231' 
    282251    config['Files']['TarRestartPeriod_beg'] = TarRestartPeriod_beg 
    283252 
    284 if TarRestartPeriod_end == None :  
     253if wu.unDefined ( 'TarRestartPeriod_end' ) :  
    285254    YearPre = YearBegin - PackFrequency  # Year to find the tarfile of the restart of beginning of simulation 
    286255    echo (f'Restart dates - Start : {YearRes}-12-31  /  End : {YearEnd}-12-31 ') 
     
    288257    config['Files']['TarRestartPeriod_end'] = TarRestartPeriod_end 
    289258 
    290 if file_restart_beg == None : 
    291     file_restart_beg = os.path.join ( R_SAVE, 'RESTART', f'{JobName}_{TarRestartPeriod_beg}_restart.tar' ) 
    292     config['Files']['file_restart_beg'] = file_restart_beg 
    293 if file_restart_end == None : 
    294     file_restart_end = os.path.join ( R_SAVE, 'RESTART', f'{JobName}_{TarRestartPeriod_end}_restart.tar' ) 
    295     config['Files']['file_restart_end'] = file_restart_end 
    296  
    297 echo ( f'{file_restart_beg}' ) 
    298 echo ( f'{file_restart_end}' ) 
    299  
    300 if file_OCE_beg == None :  
    301     file_OCE_beg = f'{TmpDir}/OCE_{JobName}_{YearRes}1231_restart.nc' 
     259if wu.unDefined ( 'tar_restart_beg' ) : 
     260    tar_restart_beg = os.path.join ( R_SAVE, 'RESTART', f'{JobName}_{TarRestartPeriod_beg}_restart.tar' ) 
     261    config['Files']['tar_restart_beg'] = tar_restart_beg 
     262if wu.unDefined ( 'tar_restart_end' ) : 
     263    tar_restart_end = os.path.join ( R_SAVE, 'RESTART', f'{JobName}_{TarRestartPeriod_end}_restart.tar' ) 
     264    config['Files']['tar_restart_end'] = tar_restart_end 
     265 
     266echo ( f'{tar_restart_beg}' ) 
     267echo ( f'{tar_restart_end}' ) 
     268 
     269# 
     270if wu.unDefined ('tar_restart_beg_ATM' ) : tar_restart_beg_ATM = tar_restart_beg 
     271if wu.unDefined ('tar_restart_beg_DYN' ) : tar_restart_beg_DYN = tar_restart_beg 
     272if wu.unDefined ('tar_restart_beg_SRF' ) : tar_restart_beg_SRF = tar_restart_beg 
     273if wu.unDefined ('tar_restart_beg_RUN' ) : tar_restart_beg_RUN = tar_restart_beg 
     274if wu.unDefined ('tar_restart_beg_OCE' ) : tar_restart_beg_OCE = tar_restart_beg 
     275if wu.unDefined ('tar_restart_beg_ICE' ) : tar_restart_beg_ICE = tar_restart_beg 
     276 
     277if wu.unDefined ('tar_restart_end_ATM' ) : tar_restart_end_ATM = tar_restart_end 
     278if wu.unDefined ('tar_restart_end_DYN' ) : tar_restart_end_DYN = tar_restart_end 
     279if wu.unDefined ('tar_restart_end_SRF' ) : tar_restart_end_SRF = tar_restart_end 
     280if wu.unDefined ('tar_restart_end_RUN' ) : tar_restart_end_RUN = tar_restart_end 
     281if wu.unDefined ('tar_restart_end_OCE' ) : tar_restart_end_OCE = tar_restart_end 
     282if wu.unDefined ('tar_restart_end_ICE' ) : tar_restart_end_ICE = tar_restart_end 
     283 
     284if wu.unDefined ( 'file_OCE_beg' ) :  
     285    file_OCE_beg = f'{RunDir}/OCE_{JobName}_{YearRes}1231_restart.nc' 
    302286    config['Files']['file_OCE_beg'] = file_OCE_beg 
    303 if file_OCE_end == None : 
    304     file_OCE_end = f'{TmpDir}/OCE_{JobName}_{YearEnd}1231_restart.nc' 
     287if wu.unDefined ( 'file_OCE_end' ) : 
     288    file_OCE_end = f'{RunDir}/OCE_{JobName}_{YearEnd}1231_restart.nc' 
    305289    config['Files']['file_OCE_end'] = file_OCE_end 
    306 if file_ICE_beg == None : 
    307     file_ICE_beg = f'{TmpDir}/ICE_{JobName}_{YearRes}1231_restart_icemod.nc' 
     290if wu.unDefined ( 'file_ICE_beg' ) : 
     291    file_ICE_beg = f'{RunDir}/ICE_{JobName}_{YearRes}1231_restart_icemod.nc' 
    308292    config['Files']['file_ICE_beg'] = file_ICE_beg 
    309 if file_ICE_end == None :  
    310     file_ICE_end = f'{TmpDir}/ICE_{JobName}_{YearEnd}1231_restart_icemod.nc' 
     293if wu.unDefined ( 'file_ICE_end' ) :  
     294    file_ICE_end = f'{RunDir}/ICE_{JobName}_{YearEnd}1231_restart_icemod.nc' 
    311295    config['Files']['file_ICE_end'] = file_ICE_end 
    312296 
     
    321305    #ndomain_opa = d_zfile.attrs['DOMAIN_number_total'] 
    322306    #d_zfile.close () 
    323     ndomain_opa = subprocess.getoutput ( f'ls {zfile}_*.nc | wc -l' ).format() 
     307    ndomain_opa = subprocess.getoutput ( f'ls {zfile}_*.nc | wc -l' ) #.format() 
    324308    return int (ndomain_opa) 
    325309 
    326 if not os.path.exists ( file_OCE_beg) : 
    327     echo ( f'Extracting {file_OCE_beg}' ) 
    328     base_file_OCE_beg = os.path.basename (file_OCE_beg) 
    329     if not os.path.exists ( os.path.join (TmpDirOCE, f'OCE_{JobName}_{YearRes}1231_restart_0000.nc') ) : 
    330         command =  f'cd {TmpDirOCE} ; tar xf {file_restart_beg}  OCE_{JobName}_{YearRes}1231_restart_*.nc' 
    331         echo ( command ) 
    332         os.system ( command ) 
    333     echo ('extract ndomain' ) 
    334     ndomain_opa = get_ndomain ( os.path.join (TmpDirOCE, f'OCE_{JobName}_{YearRes}1231_restart') ) 
    335     command = f'cd {TmpDirOCE} ; {rebuild} OCE_{JobName}_{YearRes}1231_restart {ndomain_opa} ; mv {base_file_OCE_beg} {TmpDir}' 
    336     echo ( command ) 
    337     os.system ( command ) 
    338     echo ( f'Rebuild done : {file_OCE_beg}') 
    339      
    340 if not os.path.exists ( file_OCE_end) : 
    341     echo ( f'Extracting {file_OCE_end}' ) 
    342     base_file_OCE_end = os.path.basename (file_OCE_end) 
    343     if not os.path.exists ( os.path.join (TmpDirOCE, f'OCE_{JobName}_{YearEnd}1231_restart_0000.nc') ): 
    344         command =  f'cd {TmpDirOCE} ; tar xf {file_restart_end}  OCE_{JobName}_{YearEnd}1231_restart_*.nc' 
    345         echo ( command ) 
    346         os.system ( command ) 
    347     echo ('extract ndomain' ) 
    348     ndomain_opa = get_ndomain ( os.path.join (TmpDirOCE, f'OCE_{JobName}_{YearEnd}1231_restart') ) 
    349     command = f'cd {TmpDirOCE} ; {rebuild} OCE_{JobName}_{YearEnd}1231_restart {ndomain_opa} ; mv {base_file_OCE_end} {TmpDir}' 
    350     echo ( command ) 
    351     os.system ( command ) 
    352     echo ( f'Rebuild done : {file_OCE_end}') 
    353  
    354 if not os.path.exists ( file_ICE_beg) : 
    355     echo ( f'Extracting {file_ICE_beg}' ) 
    356     base_file_ICE_beg = os.path.basename (file_ICE_beg) 
    357     if not os.path.exists ( os.path.join (TmpDirICE, f'ICE_{JobName}_{YearRes}1231_restart_icemod_0000.nc') ): 
    358         command =  f'cd {TmpDirICE} ; tar xf {file_restart_beg}  ICE_{JobName}_{YearRes}1231_restart_icemod_*.nc' 
    359         echo ( command ) 
    360         os.system ( command ) 
    361     echo ('extract ndomain' ) 
    362     ndomain_opa = get_ndomain ( os.path.join (TmpDirICE, f'ICE_{JobName}_{YearRes}1231_restart_icemod') ) 
    363     command = f'cd {TmpDirICE} ; {rebuild} ICE_{JobName}_{YearRes}1231_restart_icemod {ndomain_opa} ; mv {base_file_ICE_beg} {TmpDir} ' 
    364     echo ( command ) 
    365     os.system ( command ) 
    366     echo ( f'Rebuild done : {file_OCE_beg}') 
    367      
    368 if not os.path.exists ( file_ICE_end ) : 
    369     echo ( f'Extracting {file_ICE_end}' ) 
    370     base_file_ICE_end = os.path.basename (file_ICE_end) 
    371     if not os.path.exists ( os.path.join (TmpDirICE, f'ICE_{JobName}_{YearEnd}1231_restart_icemod_0000.nc') ): 
    372         command =  f'cd {TmpDirICE} ; tar xf {file_restart_end} ICE_{JobName}_{YearEnd}1231_restart_icemod_*.nc' 
    373         echo ( command ) 
    374         os.system ( command ) 
    375     echo ('extract ndomain' ) 
    376     ndomain_opa = get_ndomain ( os.path.join (TmpDirICE, f'ICE_{JobName}_{YearRes}1231_restart_icemod') ) 
    377     command = f'cd {TmpDirICE} ; {rebuild} ICE_{JobName}_{YearEnd}1231_restart_icemod {ndomain_opa} ; mv {base_file_ICE_end} {TmpDir}' 
    378     echo ( command ) 
    379     os.system ( command ) 
    380     echo ( f'Rebuild done : {file_ICE_end}') 
     310def extract_and_rebuild ( file_name=file_OCE_beg, tar_restart=tar_restart_end, RunDirComp=RunDirOCE, ErrorCount=ErrorCount ) : 
     311    '''Extract restart file from tar. Rebuild ocean files if needed''' 
     312    echo ( f'----------') 
     313    if os.path.exists ( file_name ) : 
     314        echo ( f'-- File ready : {file_name = }' ) 
     315    else :  
     316        echo ( f'-- Extracting {file_name = }' ) 
     317        base_resFile = Path (file_name).stem # basename, and remove suffix 
     318        # Try to extract the rebuilded file 
     319        if os.path.exists ( tar_restart ) : 
     320            command =  f'cd {RunDirComp} ; tar xf {tar_restart} {base_resFile}.nc' 
     321            echo ( command ) 
     322            try :  
     323                os.system ( command ) 
     324            except : 
     325                if not os.path.exists ( os.path.join (RunDir, f'{base_resFile}_0000.nc') ): 
     326                    command =  f'cd {RunDirComp} ; tar xf {tar_restart_end} {base_file}_*.nc' 
     327                    echo ( command ) 
     328                    ierr = os.system ( command ) 
     329                    if ierr == 0 : echo ( f'tar done : {base_resFile}.nc') 
     330                    else         : raise Exception ( f'command failed : {command}' ) 
     331                    echo ( f'extract ndomain' ) 
     332                ndomain_opa = get_ndomain ( os.path.join (RunDir, f'{base_file}') ) 
     333                command = f'cd {RunDirComp} ; {rebuild} {base_resFile} {ndomain_opa} ; mv {base_resFile}.nc {RunDir}' 
     334                echo ( command ) 
     335                ierr = os.system ( command ) 
     336                if ierr == 0 : echo ( f'Rebuild done : {base_resFile}.nc') 
     337                else         : raise Exception ( f'command failed : {command}' ) 
     338            else :  
     339                echo ( f'tar done : {base_resFile}') 
     340                command = f'cd {RunDirComp} ; mv {base_resFile}.nc {RunDir}' 
     341                ierr = os.system ( command ) 
     342                if ierr == 0 : echo ( f'command done : {command}' ) 
     343                else         : raise Exception ( f'command failed : {command = }' )                    
     344        else : 
     345            echo ( f'****** Tar restart file {tar_restart = } not found ' ) 
     346            if ContinueOnError : 
     347                ErrorCount += 1 
     348            else :  
     349                raise Exception ( f'****** tar file not found {tar_restart = } - Stopping' ) 
     350    return ErrorCount 
     351 
     352             
     353ErrorCount += extract_and_rebuild ( file_name=file_OCE_beg, tar_restart=tar_restart_beg, RunDirComp=RunDirOCE ) 
     354ErrorCount += extract_and_rebuild ( file_name=file_OCE_end, tar_restart=tar_restart_end, RunDirComp=RunDirOCE ) 
     355ErrorCount += extract_and_rebuild ( file_name=file_ICE_beg, tar_restart=tar_restart_beg, RunDirComp=RunDirICE ) 
     356ErrorCount += extract_and_rebuild ( file_name=file_ICE_end, tar_restart=tar_restart_end, RunDirComp=RunDirICE ) 
    381357 
    382358echo ('Opening OCE and ICE restart files') 
    383359if NEMO == 3.6 :  
    384     d_OCE_beg = xr.open_dataset ( os.path.join (TmpDir, file_OCE_beg), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
    385     d_OCE_end = xr.open_dataset ( os.path.join (TmpDir, file_OCE_end), decode_times=False, decode_cf=True).squeeze() 
    386     d_ICE_beg = xr.open_dataset ( os.path.join (TmpDir, file_ICE_beg), decode_times=False, decode_cf=True).squeeze() 
    387     d_ICE_end = xr.open_dataset ( os.path.join (TmpDir, file_ICE_end), decode_times=False, decode_cf=True).squeeze() 
     360    d_OCE_beg = xr.open_dataset ( os.path.join (RunDir, file_OCE_beg), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
     361    d_OCE_end = xr.open_dataset ( os.path.join (RunDir, file_OCE_end), decode_times=False, decode_cf=True).squeeze() 
     362    d_ICE_beg = xr.open_dataset ( os.path.join (RunDir, file_ICE_beg), decode_times=False, decode_cf=True).squeeze() 
     363    d_ICE_end = xr.open_dataset ( os.path.join (RunDir, file_ICE_end), decode_times=False, decode_cf=True).squeeze() 
    388364if NEMO == 4.0 or NEMO == 4.2 :  
    389     d_OCE_beg = xr.open_dataset ( os.path.join (TmpDir, file_OCE_beg), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
    390     d_OCE_end = xr.open_dataset ( os.path.join (TmpDir, file_OCE_end), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
    391     d_ICE_beg = xr.open_dataset ( os.path.join (TmpDir, file_ICE_beg), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
    392     d_ICE_end = xr.open_dataset ( os.path.join (TmpDir, file_ICE_end), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
    393  
    394 ## 
     365    d_OCE_beg = xr.open_dataset ( os.path.join (RunDir, file_OCE_beg), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
     366    d_OCE_end = xr.open_dataset ( os.path.join (RunDir, file_OCE_end), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
     367    d_ICE_beg = xr.open_dataset ( os.path.join (RunDir, file_ICE_beg), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
     368    d_ICE_end = xr.open_dataset ( os.path.join (RunDir, file_ICE_end), decode_times=False, decode_cf=True, drop_variables=['y', 'x']).squeeze() 
     369 
     370## Write the full configuration 
    395371config_out = open (FullIniFile, 'w') 
    396372config.write (config_out ) 
     
    473449    OCE_sum_e3tn_end = OCE_stock_int ( OCE_e3tn_end * OCE_msk3) 
    474450 
    475 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) ) 
     451echo ( f'OCE_sum_ssh_beg = {OCE_sum_ssh_beg:12.6e} m^3  - OCE_sum_ssh_end = {OCE_sum_ssh_end:12.6e} m^3' ) 
    476452dOCE_ssh_vol = ( OCE_sum_ssh_end - OCE_sum_ssh_beg ) 
    477453dOCE_ssh_mas = dOCE_ssh_vol * OCE_rho_liq 
    478454 
    479455if NEMO == 3.6 : 
    480     echo ( 'OCE_sum_e3tn_beg = {:12.6e} m^3  - OCE_sum_e3tn_end = {:12.6e} m^3'.format (OCE_sum_e3tn_beg, OCE_sum_e3tn_end) ) 
     456    echo ( f'OCE_sum_e3tn_beg = {OCE_sum_e3tn_beg:12.6e} m^3  - OCE_sum_e3tn_end = {OCE_sum_e3tn_end:12.6e} m^3' ) 
    481457    dOCE_e3tn_vol = ( OCE_sum_e3tn_end - OCE_sum_e3tn_beg ) 
    482458    dOCE_e3tn_mas = dOCE_e3tn_vol * OCE_rho_liq 
     
    484460dOCE_vol_wat = dOCE_ssh_vol ; dOCE_mas_wat = dOCE_ssh_mas 
    485461 
    486 echo ( 'dOCE vol    = {:12.3e} m^3'.format ( dOCE_vol_wat) ) 
    487 echo ( 'dOCE ssh    = {:12.3e} m  '.format ( dOCE_vol_wat/OCE_aire_tot) ) 
     462echo ( f'dOCE vol    = {dOCE_vol_wat             :12.3e} m^3' ) 
     463echo ( f'dOCE ssh    = {dOCE_vol_wat/OCE_aire_tot:12.3e} m  ' ) 
    488464prtFlux ( 'dOCE mass ', dOCE_mas_wat, 'e' ) 
    489465 
    490466if NEMO == 3.6 : 
    491     echo ( 'dOCE e3tn   vol    = {:12.3e} m^3'.format ( dOCE_e3tn_vol) ) 
     467    echo ( f'dOCE e3tn   vol    = {dOCE_e3tn_vol:12.3e} m^3' ) 
    492468    prtFlux ( 'dOCE e3tn   mass', dOCE_e3tn_mas, 'e' ) 
    493469 
     
    547523    dSEA_mas_wat = dOCE_mas_wat + dICE_mas_wat 
    548524 
    549 echo ( 'ICE_vol_ice_beg = {:12.6e} m^3 | ICE_vol_ice_end = {:12.6e} m^3'.format (ICE_vol_ice_beg, ICE_vol_ice_end) ) 
    550 echo ( 'ICE_vol_sno_beg = {:12.6e} m^3 | ICE_vol_sno_end = {:12.6e} m^3'.format (ICE_vol_sno_beg, ICE_vol_sno_end) ) 
    551 echo ( 'ICE_vol_pnd_beg = {:12.6e} m^3 | ICE_vol_pnd_end = {:12.6e} m^3'.format (ICE_vol_pnd_beg, ICE_vol_pnd_end) ) 
    552 echo ( 'ICE_vol_fzl_beg = {:12.6e} m^3 | ICE_vol_fzl_end = {:12.6e} m^3'.format (ICE_vol_fzl_beg, ICE_vol_fzl_end) ) 
    553  
    554 echo ( 'dICE_vol_ice   = {:12.3e} m^3'.format (dICE_vol_ice) ) 
    555 echo ( 'dICE_vol_sno   = {:12.3e} m^3'.format (dICE_vol_sno) ) 
    556 echo ( 'dICE_vol_pnd   = {:12.3e} m^3'.format (dICE_vol_pnd) ) 
    557 echo ( 'dICE_mas_ice   = {:12.3e} m^3'.format (dICE_mas_ice) ) 
    558 echo ( 'dICE_mas_sno   = {:12.3e} m^3'.format (dICE_mas_sno) 
    559 echo ( 'dICE_mas_pnd   = {:12.3e} m^3'.format (dICE_mas_pnd) 
    560 echo ( 'dICE_mas_fzl   = {:12.3e} m^3'.format (dICE_mas_fzl) 
     525echo ( 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' ) 
     526echo ( 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' ) 
     527echo ( 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' ) 
     528echo ( 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' ) 
     529 
     530echo ( f'dICE_vol_ice   = {dICE_vol_ice:12.3e} m^3' ) 
     531echo ( f'dICE_vol_sno   = {dICE_vol_sno:12.3e} m^3' ) 
     532echo ( f'dICE_vol_pnd   = {dICE_vol_pnd:12.3e} m^3' ) 
     533echo ( f'dICE_mas_ice   = {dICE_mas_ice:12.3e} m^3' ) 
     534echo ( f'dICE_mas_sno   = {dICE_mas_sno:12.3e} m^3' 
     535echo ( f'dICE_mas_pnd   = {dICE_mas_pnd:12.3e} m^3' 
     536echo ( f'dICE_mas_fzl   = {dICE_mas_fzl:12.3e} m^3' 
    561537 
    562538echo ( '\n------------------------------------------------------------') 
    563 echo ( 'Variation du contenu en eau ocean + glace ' ) 
     539echo ( 'Change in water content (ocean + ice) ' ) 
    564540prtFlux ( 'dMass (ocean)', dSEA_mas_wat, 'e', True ) 
    565541 
     
    584560 
    585561echo ( '\n------------------------------------------------------------------------------------' ) 
    586 echo ( '-- Checks in NEMO - from budget_modipsl.sh (Clement Rousset)' ) 
     562echo ( '-- Checks in NEMO - from budget_modipsl.sh (Clément Rousset)' ) 
    587563 
    588564# Read variable and computes integral over space and time 
     
    658634prtFlux ('  WFXSNW_PRE   ', ICE_mas_wfxsnw_pre, 'e', True) 
    659635prtFlux ('  WFXSUB_ERR   ', ICE_mas_wfxsub_err, 'e', True) 
    660 prtFlux ('  EVAP_OCE     ', OCE_mas_evap_oce  , 'e' ) 
     636prtFlux ('  EVAP_OCE     ', OCE_mas_evap_oce  , 'e'      ) 
    661637prtFlux ('  EVAP_ICE     ', ICE_mas_evap_ice  , 'e', True) 
    662638prtFlux ('  SNOW_OCE     ', OCE_mas_snow_oce  , 'e', True) 
    663639prtFlux ('  SNOW_ICE     ', OCE_mas_snow_ice  , 'e', True) 
    664 prtFlux ('  RAIN         ', OCE_mas_rain      , 'e' ) 
     640prtFlux ('  RAIN         ', OCE_mas_rain      , 'e'      ) 
    665641prtFlux ('  FWB          ', OCE_mas_fwb       , 'e', True) 
    666642prtFlux ('  SSR          ', OCE_mas_ssr       , 'e', True) 
     
    705681 
    706682echo ( '\n------------------------------------------------------------------------------------' ) 
    707 echo ( '-- Calculs dans la note PDF de Clement') 
     683echo ( '-- Computations in the PDF note of Clément Rousset') 
    708684echo ( 'Freshwater budget of the ice-ocean system          = emp_oce + emp_ice - runoffs - iceberg - iceshelf                = {:12.5e} (kg) '.format ( OCE_mas_emp_oce + OCE_mas_emp_ice - OCE_mas_runoffs - OCE_mas_iceberg - OCE_mas_iceshelf )) 
    709685echo ( 'Freshwater budget of the ice-ocean system          = emp_oce + emp_ice - friver  - iceberg - iceshelf                = {:12.5e} (kg) '.format ( OCE_mas_emp_oce + OCE_mas_emp_ice - OCE_mas_friver  - OCE_mas_iceberg - OCE_mas_iceshelf )) 
Note: See TracChangeset for help on using the changeset viewer.