Ignore:
Timestamp:
2019-12-06T10:30:14+01:00 (10 months ago)
Author:
jpaul
Message:

update nemo trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • utils/tools/SIREN/src/create_boundary.F90

    r9598 r12080  
    22! NEMO system team, System and Interface for oceanic RElocable Nesting 
    33!---------------------------------------------------------------------- 
    4 ! 
    5 ! 
    6 ! PROGRAM: create_boundary 
    74! 
    85! DESCRIPTION: 
     
    1916!>    method could be different for each variable. 
    2017!> 
    21 !> @section sec2 how to  
    22 !>    to create boundaries files:<br/> 
    23 !> @code{.sh} 
    24 !>    ./SIREN/bin/create_boundary create_boundary.nam 
    25 !> @endcode 
    2618!>  <br/>  
    27 !> \image html  boundary_NEATL36_70.png  
    28 !> <center>\image latex boundary_NEATL36_70.png 
     19!> @image html  boundary_NEATL36_70.png  
     20!> <center>@image latex boundary_NEATL36_70.png 
    2921!> </center> 
    3022!> 
    31 !> @note  
    32 !>    you could find a template of the namelist in templates directory. 
    33 !> 
     23!> @section sec2 how to 
     24!> USAGE: create_boundary create_bounary.nam [-v] [-h]<br/> 
     25!>    - positional arguments:<br/> 
     26!>       - create_boundary.nam<br/> 
     27!>          namelist of create_boundary 
     28!>          @note 
     29!>             a template of the namelist could be created running (in templates directory): 
     30!>             @code{.sh} 
     31!>                python create_templates.py create_boundary 
     32!>             @endcode 
     33!> 
     34!>    - optional arguments:<br/> 
     35!>       - -h, --help<br/> 
     36!>          show this help message (and exit)<br/> 
     37!>       - -v, --version<br/> 
     38!>          show Siren's version   (and exit)<br/> 
     39!>    @note  
     40!>       compiled with @a key_mpp_mpi, could be run on multi processor :<br/> 
     41!>       USAGE: create_boundary create_bounary.nam create_bounary2.nam ... [-v] [-h]<br/> 
     42!> 
     43!> @section sec_boundary create_boundary.nam 
    3444!>    create_boundary.nam contains 9 namelists:<br/> 
    35 !>       - logger namelist (namlog) 
    36 !>       - config namelist (namcfg) 
    37 !>       - coarse grid namelist (namcrs) 
    38 !>       - fine grid namelist (namfin) 
    39 !>       - variable namelist (namvar) 
    40 !>       - nesting namelist (namnst) 
    41 !>       - boundary namelist (nambdy) 
    42 !>       - vertical grid namelist (namzgr) 
    43 !>       - output namelist (namout) 
    44 !>     
    45 !>    * _logger namelist (namlog)_:<br/> 
    46 !>       - cn_logfile   : log filename 
    47 !>       - cn_verbosity : verbosity ('trace','debug','info', 
    48 !> 'warning','error','fatal','none') 
    49 !>       - in_maxerror  : maximum number of error allowed 
    50 !> 
    51 !>    * _config namelist (namcfg)_:<br/> 
    52 !>       - cn_varcfg : variable configuration file 
    53 !> (see ./SIREN/cfg/variable.cfg) 
    54 !>       - cn_dimcfg : dimension configuration file. define dimensions allowed 
    55 !> (see ./SIREN/cfg/dimension.cfg). 
    56 !>       - cn_dumcfg : useless (dummy) configuration file, for useless  
    57 !> dimension or variable (see ./SIREN/cfg/dummy.cfg). 
    58 !> 
    59 !>    * _coarse grid namelist (namcrs)_:<br/> 
    60 !>       - cn_coord0 : coordinate file 
    61 !>       - in_perio0 : NEMO periodicity index (see Model Boundary Condition in 
    62 !> [NEMO documentation](http://www.nemo-ocean.eu/About-NEMO/Reference-manuals)) 
    63 !> 
    64 !>    * _fine grid namelist (namfin)_:<br/> 
    65 !>       - cn_coord1 : coordinate file 
    66 !>       - cn_bathy1 : bathymetry file 
    67 !>       - in_perio1 : periodicity index 
    68 !> 
    69 !>    * _vertical grid namelist (namzgr)_:<br/> 
    70 !>       - dn_ppsur              : 
    71 !>       - dn_ppa0               : 
    72 !>       - dn_ppa1               : 
    73 !>       - dn_ppa2               :  
    74 !>       - dn_ppkth              : 
    75 !>       - dn_ppkth2             : 
    76 !>       - dn_ppacr              : 
    77 !>       - dn_ppacr2             : 
    78 !>       - dn_ppdzmin            : 
    79 !>       - dn_pphmax             : 
    80 !>       - in_nlevel             : number of vertical level 
    81 !> 
    82 !>    * _partial step namelist (namzps)_:<br/> 
    83 !>       - dn_e3zps_min          : 
    84 !>       - dn_e3zps_rat          :  
    85 !> 
    86 !>    * _variable namelist (namvar)_:<br/> 
    87 !>       - cn_varfile : list of variable, and associated file<br/>  
    88 !>          *cn_varfile* is the path and filename of the file where find 
    89 !>          variable.<br/>  
    90 !>          @note  
    91 !>             *cn_varfile* could be a matrix of value, if you want to filled 
    92 !>             manually variable value.<br/> 
    93 !>             the variable array of value is split into equal subdomain.<br/> 
    94 !>             Each subdomain is filled with the corresponding value  
    95 !>             of the matrix.<br/>           
    96 !>             separators used to defined matrix are: 
    97 !>                - ',' for line 
    98 !>                - '/' for row 
    99 !>                - '\' for level<br/> 
    100 !>                Example:<br/> 
    101 !>                   3,2,3/1,4,5  =>  @f$ \left( \begin{array}{ccc} 
    102 !>                                         3 & 2 & 3 \\\\ 
    103 !>                                         1 & 4 & 5 \end{array} \right) @f$ 
     45!>       - **namlog** to set logger parameters 
     46!>       - **namcfg** to set configuration file parameters 
     47!>       - **namsrc** to set source/coarse grid parameters 
     48!>       - **namtgt** to set target/fine grid parameters 
     49!>       - **namvar** to set variable parameters 
     50!>       - **namnst** to set sub domain and nesting paramters 
     51!>       - **nambdy** to set boundary parameters 
     52!>       - **namzgr** to set vertical grid parameters 
     53!>       - **namout** to set output parameters 
     54!> 
     55!>    here after, each sub-namelist parameters is detailed. 
     56!>    @note  
     57!>       default values are specified between brackets 
     58!> 
     59!> @subsection sublog namlog 
     60!>    the logger sub-namelist parameters are : 
     61!> 
     62!>    - **cn_logfile** [@a create_boundary.log]<br/> 
     63!>       logger filename 
     64!> 
     65!>    - **cn_verbosity** [@a warning]<br/> 
     66!>       verbosity level, choose between : 
     67!>          - trace 
     68!>          - debug 
     69!>          - info 
     70!>          - warning 
     71!>          - error 
     72!>          - fatal 
     73!>          - none 
     74!> 
     75!>    - **in_maxerror** [@a 5]<br/>  
     76!>       maximum number of error allowed 
     77!> 
     78!> @subsection subcfg namcfg 
     79!>    the configuration sub-namelist parameters are : 
     80!> 
     81!>    - **cn_varcfg** [@a ./cfg/variable.cfg]<br/> 
     82!>       path to the variable configuration file.<br/> 
     83!>       the variable configuration file defines standard name,  
     84!>       default interpolation method, axis,...  
     85!>       to be used for some known variables.<br/>  
     86!> 
     87!>    - **cn_dimcfg** [@a ./cfg/dimension.cfg]<br/>  
     88!>       path to the dimension configuration file.<br/>  
     89!>       the dimension configuration file defines dimensions allowed.<br/>  
     90!> 
     91!>    - **cn_dumcfg** [@a ./cfg/dummy.cfg]<br/>  
     92!>       path to the useless (dummy) configuration file.<br/> 
     93!>       the dummy configuration file defines useless  
     94!>       dimension or variable. these dimension(s) or variable(s) will not be 
     95!>       processed.<br/> 
     96!> 
     97!> @subsection subcrs namcrs  
     98!>    the coarse grid sub-namelist parameters are : 
     99!> 
     100!>    - **cn_coord0** [@a ]<br/>  
     101!>       path to the coordinate file 
     102!> 
     103!>    - **in_perio0** [@a ]<br/>  
     104!>       NEMO periodicity index<br/>  
     105!>       the NEMO periodicity could be choose between 0 to 6: 
     106!>       <dl> 
     107!>          <dt>in_perio=0</dt> 
     108!>          <dd>standard regional model</dd> 
     109!>          <dt>in_perio=1</dt> 
     110!>          <dd>east-west cyclic model</dd> 
     111!>          <dt>in_perio=2</dt> 
     112!>          <dd>model with symmetric boundary condition across the equator</dd> 
     113!>          <dt>in_perio=3</dt> 
     114!>          <dd>regional model with North fold boundary and T-point pivot</dd> 
     115!>          <dt>in_perio=4</dt> 
     116!>          <dd>global model with a T-point pivot.<br/> 
     117!>          example: ORCA2, ORCA025, ORCA12</dd> 
     118!>          <dt>in_perio=5</dt> 
     119!>          <dd>regional model with North fold boundary and F-point pivot</dd> 
     120!>          <dt>in_perio=6</dt> 
     121!>          <dd>global model with a F-point pivot<br/> 
     122!>          example: ORCA05</dd> 
     123!>          </dd> 
     124!>       </dl> 
     125!>       @sa For more information see @ref md_src_docsrc_6_perio 
     126!>       and Model Boundary Condition paragraph in the  
     127!>       [NEMO documentation](https://forge.ipsl.jussieu.fr/nemo/chrome/site/doc/NEMO/manual/pdf/NEMO_manual.pdf) 
     128!> 
     129!> @subsection subfin namfin  
     130!>    the fine grid sub-namelist parameters are : 
     131!> 
     132!>    - **cn_coord1** [@a ]<br/>  
     133!>       path to coordinate file 
     134!> 
     135!>    - **cn_bathy1** [@a ]<br/>  
     136!>       path to bathymetry file 
     137!>       @warning  
     138!> 
     139!>    - **in_perio1** [@a ]<br/> 
     140!>       NEMO periodicity index (see above) 
     141!>    @note if the fine/target coordinates file (cn_coord1) was created by SIREN, you do 
     142!>    not need to fill this parameter. SIREN will read it on the global attributes of 
     143!>    the coordinates file. 
     144!> 
     145!> @subsection subzgr namzgr 
     146!>    the vertical grid sub-namelist parameters are : 
     147!> 
     148!>    - **dn_pp_to_be_computed** [@a 0]<br/> 
     149!> 
     150!>    - **dn_ppsur** [@a -3958.951371276829]<br/> 
     151!>       coefficient to compute vertical grid 
     152!> 
     153!>    - **dn_ppa0** [@a 103.953009600000]<br/> 
     154!>       coefficient to compute vertical grid 
     155!> 
     156!>    - **dn_ppa1** [@a 2.415951269000]<br/> 
     157!>       coefficient to compute vertical grid 
     158!> 
     159!>    - **dn_ppa2** [@a 100.760928500000]<br/> 
     160!>       double tanh function parameter 
     161!> 
     162!>    - **dn_ppkth** [@a 15.351013700000]<br/> 
     163!>       coefficient to compute vertical grid 
     164!> 
     165!>    - **dn_ppkth2** [@a 48.029893720000]<br/> 
     166!>       double tanh function parameter 
     167!> 
     168!>    - **dn_ppacr** [@a 7.000000000000]<br/> 
     169!>       coefficient to compute vertical grid 
     170!> 
     171!>    - **dn_ppacr2** [@a 13.000000000000]<br/> 
     172!>       double tanh function parameter 
     173!> 
     174!>    - **dn_ppdzmin** [@a 6.]<br/> 
     175!>       minimum vertical spacing 
     176!> 
     177!>    - **dn_pphmax** [@a 5750.]<br/> 
     178!>       maximum depth 
     179!> 
     180!>    - **in_nlevel** [@a 75]<br/> 
     181!>       number of vertical level 
     182!> 
     183!>     @note  
     184!>       If *dn_ppa1*, *dn_ppa0* and *dn_ppsur* are undefined, 
     185!>       NEMO will compute them from *dn_ppdzmin, dn_pphmax, dn_ppkth, dn_ppacr* 
     186!> 
     187!> @subsection subzps namzps 
     188!>    the partial step sub-namelist parameters are : 
     189!> 
     190!>    - **dn_e3zps_min** [@a 25.]<br/> 
     191!>       minimum thickness of partial step level (meters) 
     192!>    - **dn_e3zps_rat** [@a 0.2]<br/> 
     193!>       minimum thickness ratio of partial step level 
     194!> 
     195!> @subsection subvar namvar  
     196!>    the variable sub-namelist parameters are : 
     197!> 
     198!>    - **cn_varfile** [@a ]<br/>  
     199!>       list of variable, and associated file  
     200!> 
     201!>       *cn_varfile* is the path and filename of the file where find 
     202!>       variable. 
     203!>       @note  
     204!>          *cn_varfile* could be a matrix of value, if you want to handwrite 
     205!>          variable value.<br/> 
     206!>          the variable array of value is split into equal subdomain.<br/> 
     207!>          each subdomain is filled with the corresponding value  
     208!>          of the matrix.<br/>           
     209!>          separators used to defined matrix are: 
     210!>             - ',' for line 
     211!>             - '/' for row 
     212!>             - '\' for level<br/> 
     213!>             Example:<br/> 
     214!>                3,2,3/1,4,5  =>  @f$ \left( \begin{array}{ccc} 
     215!>                                      3 & 2 & 3 \\ 
     216!>                                      1 & 4 & 5 \end{array} \right) @f$ 
     217!> 
    104218!>          @warning  
    105219!>             the same matrix is used for all boundaries. 
     
    107221!>       Examples:  
    108222!>          - 'votemper:gridT.nc', 'vozocrtx:gridU.nc' 
    109 !>          - 'votemper:10\25', 'vozocrtx:gridU.nc' 
    110 !> 
    111 !>       - cn_varinfo : list of variable and extra information about request(s) 
    112 !>          to be used (separated by ',').<br/> 
    113 !>          each elements of *cn_varinfo* is a string character.<br/> 
    114 !>          it is composed of the variable name follow by ':',  
    115 !>          then request(s) to be used on this variable.<br/>  
    116 !>          request could be: 
    117 !>             - int = interpolation method 
    118 !>             - ext = extrapolation method 
    119 !>             - flt = filter method 
    120 !>             - min = minimum value 
    121 !>             - max = maximum value 
    122 !>             - unt = new units 
    123 !>             - unf = unit scale factor (linked to new units) 
    124 !> 
    125 !>                requests must be separated by ';'.<br/> 
    126 !>                order of requests does not matter. 
    127 !> 
    128 !>          informations about available method could be find in @ref interp, 
    129 !>          @ref extrap and @ref filter.<br/> 
    130 !> 
    131 !>          Example: 'votemper:int=linear;flt=hann;ext=dist_weight',  
    132 !>                   'vosaline:int=cubic' 
    133 !>          @note  
    134 !>             If you do not specify a method which is required,  
    135 !>             default one is apply. 
    136 !> 
    137 !>    * _nesting namelist (namnst)_:<br/> 
    138 !>       - in_rhoi  : refinement factor in i-direction 
    139 !>       - in_rhoj  : refinement factor in j-direction 
    140 !> 
    141 !>    * _boundary namelist (nambdy)_:<br/> 
    142 !>       - ln_north  : use north boundary 
    143 !>       - ln_south  : use south boundary 
    144 !>       - ln_east   : use east  boundary 
    145 !>       - ln_west   : use west  boundary 
    146 !>       - cn_north  : north boundary indices on fine grid 
    147 !>          *cn_north* is a string character defining boundary 
    148 !>          segmentation.<br/> 
    149 !>          segments are separated by '|'.<br/> 
    150 !>          each segments of the boundary is composed of: 
    151 !>             - indice of velocity (orthogonal to boundary .ie.  
    152 !>                for north boundary, J-indice).  
    153 !>             - indice of segment start (I-indice for north boundary)  
    154 !>             - indice of segment end   (I-indice for north boundary)<br/> 
    155 !>                indices must be separated by ':' .<br/> 
    156 !>             - optionally, boundary size could be added between '(' and ')'  
    157 !>             in the definition of the first segment. 
    158 !>                @note  
    159 !>                   boundary width is the same for all segments of one boundary. 
    160 !> 
    161 !>          Examples: 
    162 !>             - cn_north='index1,first1:last1(width)' 
    163 !>             - cn_north='index1(width),first1:last1|index2,first2:last2' 
    164 !>             \image html  boundary_50.png  
    165 !>             <center>\image latex boundary_50.png 
    166 !>             </center> 
    167 !>       - cn_south  : south boundary indices on fine grid 
    168 !>       - cn_east   : east  boundary indices on fine grid 
    169 !>       - cn_west   : west  boundary indices on fine grid 
    170 !>       - ln_oneseg : force to use only one segment for each boundary or not 
    171 !> 
    172 !>    * _output namelist (namout)_:<br/> 
    173 !>       - cn_fileout : fine grid boundary basename 
    174 !>         (cardinal point and segment number will be automatically added) 
    175 !>       - dn_dayofs  : date offset in day (change only ouput file name) 
    176 !>       - ln_extrap  : extrapolate land point or not 
    177 !> 
    178 !>          Examples:  
    179 !>             - cn_fileout='boundary.nc'<br/> 
    180 !>                if time_counter (16/07/2015 00h) is read on input file (see varfile),  
    181 !>                west boundary will be named boundary_west_y2015m07d16 
    182 !>             - dn_dayofs=-2.<br/> 
    183 !>                if you use day offset you get boundary_west_y2015m07d14 
    184 !>        
    185 !> 
     223!>          - 'votemper:10\25', 'vozocrtx:gridU.nc'<br/> 
     224!> 
     225!>       @note  
     226!>          Optionnaly, NEMO periodicity could be added following the filename. 
     227!>          the periodicity must be separated by ';' 
     228!> 
     229!>       Example: 
     230!>          - 'votemper:gridT.nc ; perio=4' 
     231!> 
     232!>    - **cn_varinfo** [@a ]<br/>  
     233!>       list of variable and extra information about request(s) to be used<br/> 
     234!> 
     235!>       each elements of *cn_varinfo* is a string character (separated by ',').<br/> 
     236!>       it is composed of the variable name follow by ':',  
     237!>       then request(s) to be used on this variable.<br/>  
     238!>       request could be: 
     239!>          - int = interpolation method 
     240!>          - ext = extrapolation method 
     241!>          - flt = filter method 
     242!>          - min = minimum value 
     243!>          - max = maximum value 
     244!>          - unt = new units 
     245!>          - unf = unit scale factor (linked to new units) 
     246!> 
     247!>             requests must be separated by ';'.<br/> 
     248!>             order of requests does not matter.<br/> 
     249!> 
     250!>       informations about available method could be find in @ref interp, 
     251!>       @ref extrap and @ref filter modules.<br/> 
     252!>       Example:  
     253!>          - 'votemper: int=linear; flt=hann; ext=dist_weight', 
     254!>            'vosaline: int=cubic' 
     255!> 
     256!>       @note  
     257!>          If you do not specify a method which is required,  
     258!>          default one is apply. 
     259!> 
     260!> @subsection subnst namnst  
     261!>    the nesting sub-namelist parameters are : 
     262!> 
     263!>    - **in_rhoi**  [@a 1]<br/>  
     264!>       refinement factor in i-direction 
     265!> 
     266!>    - **in_rhoj**  [@a 1]<br/>  
     267!>       refinement factor in j-direction 
     268!> 
     269!>    @note  
     270!>       coarse grid indices will be deduced from fine grid 
     271!>       coordinate file. 
     272!> 
     273!> @subsection subbdy nambdy 
     274!>    the boundary sub-namelist parameters are : 
     275!> 
     276!>    - **ln_north** [@a .TRUE.]<br/>  
     277!>       logical to use north boundary or not 
     278!>    - **ln_south** [@a .TRUE.]<br/> 
     279!>       logical to use south boundary or not 
     280!>    - **ln_east**  [@a .TRUE.]<br/> 
     281!>       logical to use east boundary or not 
     282!>    - **ln_west**  [@a .TRUE.]<br/> 
     283!>       logical to use west  boundary or not 
     284!>    <br/> <br/> 
     285!>    - **cn_north** [@a ]<br/> 
     286!>       north boundary indices on fine grid<br/> 
     287!>    - **cn_south** [@a ]<br/> 
     288!>       south boundary indices on fine grid<br/> 
     289!>    - **cn_east**  [@a ]<br/> 
     290!>       east  boundary indices on fine grid<br/> 
     291!>    - **cn_west**  [@a ]<br/> 
     292!>       west  boundary indices on fine grid<br/> 
     293!> 
     294!>       *cn_north* is a string character defining boundary 
     295!>       segmentation.<br/> 
     296!>       segments are separated by '|'.<br/> 
     297!>       each segments of the boundary is composed of: 
     298!>          - indice of velocity (orthogonal to boundary .ie.  
     299!>             for north boundary, J-indice).  
     300!>          - indice of segment start (I-indice for north boundary)  
     301!>          - indice of segment end   (I-indice for north boundary)<br/> 
     302!>             indices must be separated by ':' .<br/> 
     303!>          - optionally, boundary size could be added between '(' and ')'  
     304!>          in the first segment defined. 
     305!>             @note  
     306!>                boundary size is the same for all segments of one boundary. 
     307!> 
     308!>       Examples: 
     309!>          - cn_north='index1,first1:last1(width)' 
     310!>          - cn_north='index1(width),first1:last1|index2,first2:last2' 
     311!> 
     312!>       @image html  boundary_50.png  
     313!>       <center>@image latex boundary_50.png 
     314!>       </center> 
     315!> 
     316!>    - **ln_oneseg** [@a .TRUE.]<br/> 
     317!>       logical to use only one segment for each boundary or not 
     318!> 
     319!>    @note 
     320!>       the number of point(s) with coarse value save at boundaries is 
     321!>       defined with the *weight* variable (see @ref merge_bathy) 
     322!> 
     323!> @subsection subout namout  
     324!>    the output sub-namelist parameter is : 
     325!> 
     326!>    - **cn_fileout** [@a boundary.nc]<br/> 
     327!>       output bathymetry filename 
     328!> 
     329!>       @note 
     330!>          cardinal point and segment number will be automatically added 
     331!> 
     332!>    - **ln_extrap** [@a .FALSE.]<br/> 
     333!>       extrapolate on land point 
     334!> 
     335!>    - **dn_dayofs** [@a 0]<br/> 
     336!>       date offset in day (change only ouput file name) 
     337!> 
     338!>       Examples:  
     339!>          - cn_fileout='boundary.nc'<br/> 
     340!>             if time_counter (16/07/2015 00h) is read on input file (see varfile),  
     341!>             west boundary will be named boundary_west_y2015m07d16 
     342!>          - dn_dayofs=-2.<br/> 
     343!>             if you use day offset you get boundary_west_y2015m07d14 
     344!> 
     345!> @subsection sub_nambdy How to fill Lateral Boundary Condition in NEMO namelist 
     346!>    To use boundary condition within NEMO, you need to fill the NEMO namelist.<br/> 
     347!>    As this is a little bit messy for lateral boundary condition, here after 
     348!>    is an explanation of how to do it. 
     349!> 
     350!>    This will be done in 3 steps. 
     351!> 
     352!>    @subsubsection ss_nambdy nambdy 
     353!>       The *nambdy* NEMO sub-namelist defines open boundaries.<br/> 
     354!>       Here we indicate the number of open boundary (**nb_bdy**). 
     355!> 
     356!>       @note 
     357!>          we have to fill most of the parameters with as many elements as there are open boundaries 
     358!>  
     359!>       Regarding the width of the relaxation zone **nn_rimwidth**, 
     360!>       this information is available as a global attribute (**bdy_width**)  
     361!>       in the metadata of boundary files created with SIREN  
     362!> 
     363!> @code{.sh} 
     364!>    ncdump -h boundary_east.nc 
     365!> @endcode 
     366!>       @warning 
     367!>          The order of the boundaries must stay unchanged, in parameters list as well as  
     368!>          in the next sub-namelsits  
     369!> 
     370!>    Example:<br/> 
     371!>       here is an example for a domain with two boundaries East and North 
     372!> 
     373!> @code{.sh} 
     374!> !----------------------------------------------------------------------- 
     375!> &nambdy        !  unstructured open boundaries                          ("key_bdy") 
     376!> !----------------------------------------------------------------------- 
     377!>   nb_bdy         = 2                    !  number of open boundary sets 
     378!>   ln_coords_file = .false.,.false.      !  =T : read bdy coordinates from file 
     379!>   cn_coords_file = '',''                !  bdy coordinates files 
     380!>   ln_mask_file   = .false.              !  =T : read mask from file 
     381!>   cn_mask_file   = ''                   !  name of mask file (if ln_mask_file=.TRUE.) 
     382!>   cn_dyn2d       = 'flather','flather'  ! 
     383!>   nn_dyn2d_dta   = 1,1                  !  = 0, bdy data are equal to the initial state 
     384!>                                         !  = 1, bdy data are read in 'bdydata   .nc' files 
     385!>                                         !  = 2, use tidal harmonic forcing data from files 
     386!>                                         !  = 3, use external data AND tidal harmonic forcing 
     387!>   cn_dyn3d       = 'specified','specified' !   
     388!>   nn_dyn3d_dta   = 1,1                  !  = 0, bdy data are equal to the initial state 
     389!>                                         !  = 1, bdy data are read in 'bdydata   .nc' files 
     390!>   cn_tra         = 'specified','specified' !  
     391!>   nn_tra_dta     = 1,1                  !  = 0, bdy data are equal to the initial state 
     392!>                                         !  = 1, bdy data are read in 'bdydata   .nc' files 
     393!>                                         ! 
     394!>   ln_tra_dmp    =.true.,.true.          !  open boudaries conditions for tracers 
     395!>   ln_dyn3d_dmp  =.true.,.true.          !  open boundary condition for baroclinic velocities 
     396!>   rn_time_dmp     =  1.,1.              ! Damping time scale in days  
     397!>   rn_time_dmp_out =  1.,1.              ! Outflow damping time scale 
     398!>   nn_rimwidth   = 10,10                 !  width of the relaxation zone 
     399!>   ln_vol        = .false.               !  total volume correction (see nn_volctl parameter) 
     400!>   nn_volctl     = 1                     !  = 0, the total water flux across open boundaries is zero 
     401!> / 
     402!> @endcode 
     403!> 
     404!>    @subsubsection ss_nambdy_index nambdy_index 
     405!>       The *nambdy_index* NEMO sub-namelist describes the boundaries we will use. 
     406!> 
     407!>       @warning 
     408!>          We have to add as many as sub namelist *nambdy_index* than open boundaries (nb_bdy), 
     409!>          and keep them in the same order as above 
     410!> 
     411!>          Here we indicate if the open boundary is North, South, East, or West (**ctypebdy**).<br/> 
     412!>          We also indicate indice of segment start and end (respectively **nbdybeg**  and **nbdyend**) 
     413!>          as well as indice of velocity row or column (**nbdyind**).<br/> 
     414!> 
     415!>          Those informations are available as global attributes  
     416!>          (respectively **bdy_deb, bdy_end, bdy_ind**) in the metadata of our boundary files  
     417!>          created with SIREN. 
     418!> 
     419!>    Example:<br/> 
     420!>       here is an example for a domain with two boundaries East and North 
     421!> 
     422!> @code{.sh} 
     423!>    !----------------------------------------------------------------------- 
     424!>    &nambdy_index  !  structured open boundaries definition     ("key_bdy") 
     425!>    !----------------------------------------------------------------------- 
     426!>      ctypebdy ='E'                   ! Open boundary type (W,E,S or N) 
     427!>      nbdyind  = 407                  ! indice of velocity row or column 
     428!>                                      ! if ==-1, set obc at the domain boundary 
     429!>                                      !        , discard start and end indices 
     430!>      nbdybeg  = 32                   ! indice of segment start 
     431!>      nbdyend  = 300                  ! indice of segment end 
     432!>    / 
     433!>    !----------------------------------------------------------------------- 
     434!>    &nambdy_index  !  structured open boundaries definition     ("key_bdy") 
     435!>    !----------------------------------------------------------------------- 
     436!>      ctypebdy ='N'                   ! Open boundary type (W,E,S or N) 
     437!>      nbdyind  = 299                  ! indice of velocity row or column 
     438!>                                      ! if ==-1, set obc at the domain boundary 
     439!>                                      !        , discard start and end indices 
     440!>      nbdybeg  = 200                  ! indice of segment start 
     441!>      nbdyend  = 408                  ! indice of segment end 
     442!>    / 
     443!> @endcode 
     444!> 
     445!>    @subsubsection ss_nambdy_dat nambdy_dta 
     446!>       The *nambdy_dta* NEMO sub-namelists describes the boundary data and files to be used.<br/> 
     447!>       @warning 
     448!>          We have to add as many as sub namelist *nambdy_dta* than open boundaries (nb_bdy), 
     449!>          and keep them in the same order as above 
     450!> 
     451!>    Example:<br/> 
     452!>       here is an example for a domain with two boundaries East and North 
     453!> 
     454!> @code{.sh} 
     455!> !----------------------------------------------------------------------- 
     456!> &nambdy_dta      !  open boundaries - external data           ("key_bdy") 
     457!> !----------------------------------------------------------------------- 
     458!> !          ! file name !  freq (hours)   ! variable ! time interp. ! clim  ! 'yearly'/ ! weights... 
     459!> !          !           ! (if < 0 months) !   name   !   (logical)  ! (T/F) ! 'monthly' ! filename 
     460!>   bn_ssh = 'boundary_east' , -12   , 'sossheig' , .false. , .true. , 'yearly' , '', '', '' 
     461!>   bn_u2d = 'boundary_east' , -12   , 'vobtcrtx' , .false. , .true. , 'yearly' , '', '', '' 
     462!>   bn_v2d = 'boundary_east' , -12   , 'vobtcrty' , .false. , .true. , 'yearly' , '', '', '' 
     463!>   bn_u3d = 'boundary_east' , -12   , 'vozocrtx' , .false. , .true. , 'yearly' , '', '', '' 
     464!>   bn_v3d = 'boundary_east' , -12   , 'vomecrty' , .false. , .true. , 'yearly' , '', '', '' 
     465!>   bn_tem = 'boundary_east' , -12   , 'votemper' , .false. , .true. , 'yearly' , '', '', '' 
     466!>   bn_sal = 'boundary_east' , -12   , 'vosaline' , .false. , .true. , 'yearly' , '', '', '' 
     467!>   cn_dir = './' 
     468!>   ln_full_vel = .true. 
     469!> / 
     470!> !----------------------------------------------------------------------- 
     471!> &nambdy_dta      !  open boundaries - external data           ("key_bdy") 
     472!> !----------------------------------------------------------------------- 
     473!> !          ! file name !  freq (hours)   ! variable ! time interp. ! clim  ! 'yearly'/ ! weights... 
     474!> !          !           ! (if < 0 months) !   name   !   (logical)  ! (T/F) ! 'monthly' ! filename 
     475!>   bn_ssh = 'boundary_north' , -12   , 'sossheig' ,  .false. , .true. , 'yearly' , '', '', '' 
     476!>   bn_u2d = 'boundary_north' , -12   , 'vobtcrtx' ,  .false. , .true. , 'yearly' , '', '', '' 
     477!>   bn_v2d = 'boundary_north' , -12   , 'vobtcrty' ,  .false. , .true. , 'yearly' , '', '', '' 
     478!>   bn_u3d = 'boundary_north' , -12   , 'vozocrtx' ,  .false. , .true. , 'yearly' , '', '', '' 
     479!>   bn_v3d = 'boundary_north' , -12   , 'vomecrty' ,  .false. , .true. , 'yearly' , '', '', '' 
     480!>   bn_tem = 'boundary_north' , -12   , 'votemper' ,  .false. , .true. , 'yearly' , '', '', '' 
     481!>   bn_sal = 'boundary_north' , -12   , 'vosaline' ,  .false. , .true. , 'yearly' , '', '', '' 
     482!>   cn_dir = './' 
     483!>   ln_full_vel = .true. 
     484!> / 
     485!> @endcode 
     486!> 
     487!> <hr> 
    186488!> @author J.Paul 
    187 ! REVISION HISTORY: 
     489!> 
    188490!> @date November, 2013 - Initial Version 
    189491!> @date September, 2014 
     
    203505!> @date October, 2016 
    204506!> - dimension to be used select from configuration file 
     507!> @date January, 2019 
     508!> - add url path to global attributes of output file(s) 
     509!> - create and clean file structure to avoid memory leaks 
     510!> - explain how to fill Lateral Boundary Condition in NEMO namelist 
     511!> @date February, 2019 
     512!> - rename sub namelist namcrs to namsrc 
     513!> - rename sub namelist namfin to namtgt 
     514!> @date August, 2019 
     515!> - use periodicity read from namelist, and store in multi structure 
     516!> @date Ocober, 2019 
     517!> - add help and version optional arguments 
    205518!> 
    206519!> @todo 
    207520!> - rewitre using meshmask instead of bathymetry and coordinates files. 
    208521!> 
    209 !> @note Software governed by the CeCILL licence     (./LICENSE) 
     522!> @note Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    210523!---------------------------------------------------------------------- 
    211524PROGRAM create_boundary 
     
    235548   IMPLICIT NONE 
    236549 
     550   ! parameters 
     551   CHARACTER(LEN=lc), PARAMETER  :: cp_myname = "create_boundary" 
     552 
    237553   ! local variable 
     554   CHARACTER(LEN=lc)                                  :: cl_arg 
     555   CHARACTER(LEN=lc)                                  :: cl_errormsg 
     556 
    238557   INTEGER(i4)                                        :: il_narg 
    239558 
    240559#if defined key_mpp_mpi 
    241560   ! mpp variable 
    242    CHARACTER(LEN=lc), DIMENSION(:)      , ALLOCATABLE :: cl_namelist 
     561   CHARACTER(LEN=lc), DIMENSION(:)      , ALLOCATABLE :: cl_args 
     562 
    243563   INTEGER(i4)                                        :: ierror 
    244564   INTEGER(i4)                                        :: iproc 
     
    257577   !------------------------------------------------------------------- 
    258578 
     579   ! 
     580   ! Initialisation 
     581   ! -------------- 
     582   ! 
    259583   il_narg=COMMAND_ARGUMENT_COUNT() !f03 intrinsec 
     584 
    260585#if ! defined key_mpp_mpi 
    261586 
    262    IF( il_narg/=1 )THEN 
    263       PRINT *,"CREATE BOUNDARY: ERROR. need one namelist" 
    264       STOP 
     587   ! Traitement des arguments fournis 
     588   ! -------------------------------- 
     589   IF( il_narg /= 1 )THEN 
     590      WRITE(cl_errormsg,*) ' ERROR : one argument is needed ' 
     591      CALL fct_help(cp_myname,cl_errormsg)  
     592      CALL EXIT(1) 
    265593   ELSE 
    266       CALL GET_COMMAND_ARGUMENT(1,cl_namelist) !f03 intrinsec 
     594 
     595      CALL GET_COMMAND_ARGUMENT(1,cl_arg) !f03 intrinsec 
     596      SELECT CASE (cl_arg) 
     597         CASE ('-v', '--version') 
     598 
     599            CALL fct_version(cp_myname) 
     600            CALL EXIT(0) 
     601 
     602         CASE ('-h', '--help') 
     603 
     604            CALL fct_help(cp_myname) 
     605            CALL EXIT(0) 
     606 
     607         CASE DEFAULT 
     608 
     609            cl_namelist=cl_arg 
     610             
     611            CALL GET_COMMAND_ARGUMENT(1,cl_namelist) !f03 intrinsec 
     612            CALL create_boundary__mono(cl_namelist) 
     613 
     614      END SELECT 
    267615   ENDIF 
    268  
    269    CALL create__boundary(cl_namelist) 
    270  
    271616#else 
    272617 
     
    276621   CALL mpi_comm_size(mpi_comm_world,nproc,ierror) 
    277622 
    278    IF( il_narg==0 )THEN 
    279       PRINT *,"CREATE BOUNDARY: ERROR. need at least one namelist" 
    280       STOP 
     623   ! Traitement des arguments fournis 
     624   ! -------------------------------- 
     625   IF( il_narg == 0 )THEN 
     626      WRITE(cl_errormsg,*) ' ERROR : at least one argument is needed ' 
     627      CALL fct_help(cp_myname,cl_errormsg)  
     628      CALL EXIT(1) 
    281629   ELSE 
    282       ALLOCATE(cl_namelist(il_narg)) 
     630 
     631      ALLOCATE(cl_args(il_narg)) 
    283632      DO jm=1,il_narg 
    284          CALL GET_COMMAND_ARGUMENT(jm,cl_namelist(jm)) 
     633 
     634         CALL GET_COMMAND_ARGUMENT(jm,cl_arg) !f03 intrinsec 
     635         SELECT CASE (cl_arg) 
     636            CASE ('-v', '--version') 
     637 
     638               CALL fct_version(cp_myname) 
     639               CALL EXIT(0) 
     640 
     641            CASE ('-h', '--help') 
     642 
     643               CALL fct_help(cp_myname) 
     644               CALL EXIT(0) 
     645 
     646            CASE DEFAULT 
     647 
     648               cl_args(jm)=TRIM(cl_arg) 
     649 
     650         END SELECT 
    285651      ENDDO 
    286652   ENDIF 
     
    293659   DO jm=1, il_narg 
    294660      IF ( il_nprog(jm) .eq. iproc ) THEN 
    295          CALL create__boundary(cl_namelist(jm)) 
     661         CALL create_boundary__mono(cl_args(jm)) 
    296662      ENDIF 
    297663   ENDDO 
     
    299665   CALL mpi_finalize(ierror) 
    300666 
    301    DEALLOCATE(cl_namelist) 
     667   DEALLOCATE(cl_args) 
    302668   DEALLOCATE(il_nprog) 
    303669#endif 
    304670 
    305671CONTAINS 
    306 SUBROUTINE create__boundary(cd_namelist) 
     672   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     673   SUBROUTINE create_boundary__mono(cd_namelist) 
    307674   !------------------------------------------------------------------- 
    308675   !> @brief 
     
    330697   CHARACTER(LEN=lc)                                  :: cl_dimorder 
    331698   CHARACTER(LEN=lc)                                  :: cl_fmt 
     699   CHARACTER(LEN=lc)                                  :: cl_url 
    332700 
    333701   INTEGER(i4)                                        :: il_status 
     
    367735   TYPE(TDOM)       , DIMENSION(:,:,:)  , ALLOCATABLE :: tl_segdom1 
    368736 
     737   TYPE(TFILE)                                        :: tl_file 
    369738   TYPE(TFILE)                                        :: tl_fileout 
    370739    
     
    386755   ! namelist variable 
    387756   ! namlog 
    388    CHARACTER(LEN=lc)                       :: cn_logfile = 'create_boundary.log'  
    389    CHARACTER(LEN=lc)                       :: cn_verbosity = 'warning'  
    390    INTEGER(i4)                             :: in_maxerror = 5 
     757   CHARACTER(LEN=lc)                       :: cn_logfile    = 'create_boundary.log'  
     758   CHARACTER(LEN=lc)                       :: cn_verbosity  = 'warning'  
     759   INTEGER(i4)                             :: in_maxerror   = 5 
    391760 
    392761   ! namcfg 
    393    CHARACTER(LEN=lc)                       :: cn_varcfg = './cfg/variable.cfg'  
    394    CHARACTER(LEN=lc)                       :: cn_dimcfg = './cfg/dimension.cfg' 
    395    CHARACTER(LEN=lc)                       :: cn_dumcfg = './cfg/dummy.cfg' 
    396  
    397    ! namcrs 
    398    CHARACTER(LEN=lc)                       :: cn_coord0 = ''  
    399    INTEGER(i4)                             :: in_perio0 = -1 
    400  
    401    ! namfin 
    402    CHARACTER(LEN=lc)                       :: cn_coord1 = ''  
    403    CHARACTER(LEN=lc)                       :: cn_bathy1 = ''  
    404    INTEGER(i4)                             :: in_perio1 = -1 
     762   CHARACTER(LEN=lc)                       :: cn_varcfg  = './cfg/variable.cfg'  
     763   CHARACTER(LEN=lc)                       :: cn_dimcfg  = './cfg/dimension.cfg' 
     764   CHARACTER(LEN=lc)                       :: cn_dumcfg  = './cfg/dummy.cfg' 
     765 
     766   ! namsrc 
     767   CHARACTER(LEN=lc)                       :: cn_coord0  = ''  
     768   INTEGER(i4)                             :: in_perio0  = -1 
     769 
     770   ! namtgt 
     771   CHARACTER(LEN=lc)                       :: cn_coord1  = ''  
     772   CHARACTER(LEN=lc)                       :: cn_bathy1  = ''  
     773   INTEGER(i4)                             :: in_perio1  = -1 
    405774 
    406775   !namzgr 
     776   REAL(dp)                                :: dn_pp_to_be_computed = 0._dp 
    407777   REAL(dp)                                :: dn_ppsur   = -3958.951371276829_dp 
    408778   REAL(dp)                                :: dn_ppa0    =   103.953009600000_dp 
     
    418788 
    419789   !namzps 
    420    REAL(dp)                                :: dn_e3zps_min = 25._dp 
    421    REAL(dp)                                :: dn_e3zps_rat = 0.2_dp 
     790   REAL(dp)                                :: dn_e3zps_min  = 25._dp 
     791   REAL(dp)                                :: dn_e3zps_rat  = 0.2_dp 
    422792 
    423793   ! namvar 
     
    426796 
    427797   ! namnst 
    428    INTEGER(i4)                             :: in_rhoi  = 0 
    429    INTEGER(i4)                             :: in_rhoj  = 0 
     798   INTEGER(i4)                             :: in_rhoi    = 1 
     799   INTEGER(i4)                             :: in_rhoj    = 1 
    430800 
    431801   ! nambdy 
     
    449819   &  cn_logfile,    &  !< log file 
    450820   &  cn_verbosity,  &  !< log verbosity 
    451    &  in_maxerror 
    452  
    453    NAMELIST /namcfg/ &  !< config namelist 
    454    &  cn_varcfg, &       !< variable configuration file 
    455    &  cn_dimcfg, &       !< dimension configuration file 
    456    &  cn_dumcfg          !< dummy configuration file 
    457  
    458    NAMELIST /namcrs/ &  !< coarse grid namelist 
     821   &  in_maxerror       !< logger maximum error 
     822 
     823   NAMELIST /namcfg/ &  !< configuration namelist 
     824   &  cn_varcfg,     &  !< variable configuration file 
     825   &  cn_dimcfg,     &  !< dimension configuration file 
     826   &  cn_dumcfg         !< dummy configuration file 
     827 
     828   NAMELIST /namsrc/ &  !< source/coarse grid namelist 
    459829   &  cn_coord0,     &  !< coordinate file 
    460830   &  in_perio0         !< periodicity index 
    461   
    462    NAMELIST /namfin/ &  !< fine grid namelist 
     831 
     832   NAMELIST /namtgt/ &  !< target/fine grid namelist 
    463833   &  cn_coord1,     &  !< coordinate file 
    464834   &  cn_bathy1,     &  !< bathymetry file 
     
    466836  
    467837   NAMELIST /namzgr/ & 
    468    &  dn_ppsur,     & 
    469    &  dn_ppa0,      & 
    470    &  dn_ppa1,      & 
    471    &  dn_ppa2,      & 
    472    &  dn_ppkth,     & 
    473    &  dn_ppkth2,    & 
    474    &  dn_ppacr,     & 
    475    &  dn_ppacr2,    & 
    476    &  dn_ppdzmin,   & 
    477    &  dn_pphmax,    & 
     838   &  dn_pp_to_be_computed, & 
     839   &  dn_ppsur,      & 
     840   &  dn_ppa0,       & 
     841   &  dn_ppa1,       & 
     842   &  dn_ppa2,       & 
     843   &  dn_ppkth,      & 
     844   &  dn_ppkth2,     & 
     845   &  dn_ppacr,      & 
     846   &  dn_ppacr2,     & 
     847   &  dn_ppdzmin,    & 
     848   &  dn_pphmax,     & 
    478849   &  in_nlevel         !< number of vertical level 
    479850 
    480851   NAMELIST /namzps/ & 
    481    &  dn_e3zps_min, & 
     852   &  dn_e3zps_min,  & 
    482853   &  dn_e3zps_rat 
    483854 
    484855   NAMELIST /namvar/ &  !< variable namelist 
    485    &  cn_varfile, &     !< list of variable and file where find it. (ex: 'votemper:GLORYS_gridT.nc' )  
     856   &  cn_varfile,    &  !< list of variable and file where find it. (ex: 'votemper:GLORYS_gridT.nc' )  
    486857   &  cn_varinfo        !< list of variable and method to apply on. (ex: 'votemper:linear','vosaline:cubic' ) 
    487858  
     
    545916      CALL att_get_dummy(TRIM(cn_dumcfg)) 
    546917 
    547       READ( il_fileid, NML = namcrs ) 
    548       READ( il_fileid, NML = namfin ) 
     918      READ( il_fileid, NML = namsrc ) 
     919      READ( il_fileid, NML = namtgt ) 
    549920      READ( il_fileid, NML = namzgr ) 
    550921      READ( il_fileid, NML = namvar ) 
     
    566937   ELSE 
    567938 
    568       PRINT *,"CREATE BOUNDARY: ERROR. can not find "//TRIM(cd_namelist) 
    569       STOP 
     939      WRITE(cl_errormsg,*) " ERROR : can't find "//TRIM(cl_namelist) 
     940      CALL fct_help(cp_myname,cl_errormsg)  
     941      CALL EXIT(1) 
    570942 
    571943   ENDIF 
    572944 
    573945   CALL multi_print(tl_multi) 
     946 
    574947   IF( tl_multi%i_nvar <= 0 )THEN 
    575948      CALL logger_fatal("CREATE BOUNDARY: no variable to be used."//& 
     
    579952   ! open files 
    580953   IF( TRIM(cn_coord0) /= '' )THEN 
    581       tl_coord0=mpp_init( file_init(TRIM(cn_coord0)), id_perio=in_perio0) 
     954      tl_file= file_init(TRIM(cn_coord0)) 
     955      tl_coord0=mpp_init( tl_file, id_perio=in_perio0) 
     956      ! clean 
     957      CALL file_clean(tl_file) 
    582958      CALL grid_get_info(tl_coord0) 
    583959   ELSE 
     
    587963 
    588964   IF( TRIM(cn_coord1) /= '' )THEN 
    589       tl_coord1=mpp_init( file_init(TRIM(cn_coord1)), id_perio=in_perio1) 
     965      tl_file=file_init(TRIM(cn_coord1)) 
     966      tl_coord1=mpp_init( tl_file, id_perio=in_perio1) 
     967      ! clean 
     968      CALL file_clean(tl_file) 
    590969      CALL grid_get_info(tl_coord1) 
    591970   ELSE 
     
    595974 
    596975   IF( TRIM(cn_bathy1) /= '' )THEN 
    597       tl_bathy1=mpp_init( file_init(TRIM(cn_bathy1)), id_perio=in_perio1) 
     976      tl_file=file_init(TRIM(cn_bathy1)) 
     977      tl_bathy1=mpp_init( tl_file, id_perio=in_perio1) 
     978      ! clean 
     979      CALL file_clean(tl_file) 
    598980      CALL grid_get_info(tl_bathy1) 
    599981   ELSE 
     
    615997 
    616998      cl_bdyout=boundary_set_filename( TRIM(cn_fileout), & 
    617       &                                TRIM(cp_card(jk)) ) 
     999         &                             TRIM(cp_card(jk)) ) 
    6181000      INQUIRE(FILE=TRIM(cl_bdyout), EXIST=ll_exist) 
    6191001      IF( ll_exist )THEN 
     
    6281010   IF( in_rhoi < 1 .OR. in_rhoj < 1 )THEN 
    6291011      CALL logger_error("CREATE BOUNDARY: invalid refinement factor."//& 
    630       &  " check namelist "//TRIM(cd_namelist)) 
     1012         &  " check namelist "//TRIM(cd_namelist)) 
    6311013   ELSE 
    6321014      il_rho(jp_I)=in_rhoi 
     
    6371019   ! compute coarse grid indices around fine grid 
    6381020   il_ind(:,:)=grid_get_coarse_index(tl_coord0, tl_coord1, & 
    639    &                                 id_rho=il_rho(:)) 
     1021      &                              id_rho=il_rho(:)) 
    6401022 
    6411023   il_imin0=il_ind(1,1) ; il_imax0=il_ind(1,2) 
     
    6471029   ! check coordinate file 
    6481030   CALL grid_check_coincidence( tl_coord0, tl_coord1, & 
    649    &                            il_imin0, il_imax0, & 
    650    &                            il_jmin0, il_jmax0, & 
    651    &                            il_rho(:) )       
     1031      &                         il_imin0, il_imax0, & 
     1032      &                         il_jmin0, il_jmax0, & 
     1033      &                         il_rho(:) )       
    6521034 
    6531035   ! read or compute boundary 
     
    6621044   ! get boundaries indices 
    6631045   tl_bdy(:)=boundary_init(tl_var1, ln_north, ln_south, ln_east, ln_west, & 
    664    &                                cn_north, cn_south, cn_east, cn_west, & 
    665    &                                ln_oneseg )  
     1046      &                             cn_north, cn_south, cn_east, cn_west, & 
     1047      &                             ln_oneseg )  
    6661048 
    6671049 
     
    6821064            ! get fine grid segment domain 
    6831065            tl_segdom1(:,jk,jl)=create_boundary_get_dom( tl_bathy1, & 
    684             &                                            tl_bdy(jl), jk ) 
     1066               &                                         tl_bdy(jl), jk ) 
    6851067 
    6861068            IF( .NOT. ln_extrap )THEN 
     
    6951077            DO jj=1,ip_npoint 
    6961078               CALL dom_add_extra(tl_segdom1(jj,jk,jl), & 
    697                &                  il_rho(jp_I), il_rho(jp_J)) 
     1079                  &               il_rho(jp_I), il_rho(jp_J)) 
    6981080            ENDDO 
    6991081 
     
    7131095   IF( .NOT. ASSOCIATED(tl_multi%t_mpp) )THEN 
    7141096      CALL logger_error("CREATE BOUNDARY: no file to work on. "//& 
    715       &                 "check cn_varfile in namelist.") 
     1097         &              "check cn_varfile in namelist.") 
    7161098   ELSE 
    7171099 
     
    7211103 
    7221104         WRITE(cl_data,'(a,i2.2)') 'data-',jvar+1 
    723  
    7241105         IF( .NOT. ASSOCIATED(tl_multi%t_mpp(ji)%t_proc(1)%t_var) )THEN 
    7251106 
    7261107            CALL logger_error("CREATE BOUNDARY: no variable to work on for "//& 
    727             &                 "mpp "//TRIM(tl_multi%t_mpp(ji)%c_name)//& 
    728             &                 ". check cn_varfile in namelist.") 
     1108               &              "mpp "//TRIM(tl_multi%t_mpp(ji)%c_name)//& 
     1109               &              ". check cn_varfile in namelist.") 
    7291110 
    7301111         ELSEIF( TRIM(tl_multi%t_mpp(ji)%c_name) == TRIM(cl_data) )THEN 
     
    7601141                        ! fill value with matrix data 
    7611142                        tl_segvar1(jvar,jk,jl)=create_boundary_matrix( & 
    762                         &                          tl_var1, & 
    763                         &                          tl_segdom1(jpoint,jk,jl), & 
    764                         &                          in_nlevel ) 
     1143                           &                          tl_var1, & 
     1144                           &                          tl_segdom1(jpoint,jk,jl), & 
     1145                           &                          in_nlevel ) 
    7651146 
    7661147                        !del extra 
    7671148                        CALL dom_del_extra( tl_segvar1(jvar,jk,jl), & 
    768                         &                   tl_segdom1(jpoint,jk,jl) ) 
     1149                           &                tl_segdom1(jpoint,jk,jl) ) 
    7691150 
    7701151                     ENDDO 
     
    7721153                  ENDIF 
    7731154               ENDDO 
    774                 
     1155 
    7751156               ! clean 
    7761157               CALL var_clean(tl_var1) 
     
    7841165            WRITE(*,'(a)') "work on file "//TRIM(tl_multi%t_mpp(ji)%c_name) 
    7851166            !  
    786             tl_mpp=mpp_init(file_init(TRIM(tl_multi%t_mpp(ji)%t_proc(1)%c_name))) 
     1167            tl_file=file_init(TRIM(tl_multi%t_mpp(ji)%t_proc(1)%c_name), & 
     1168               &              id_perio=tl_multi%t_mpp(ji)%i_perio) 
     1169            tl_mpp=mpp_init( tl_file ) 
     1170            !tl_mpp=mpp_init( tl_file, id_perio=tl_multi%t_mpp(ji)%t_proc(1)%i_perio) 
     1171            ! clean 
     1172            CALL file_clean(tl_file) 
    7871173            CALL grid_get_info(tl_mpp) 
    7881174 
     
    8901276                        CALL dom_del_extra( tl_segvar1(jvar+jj,jk,jl), & 
    8911277                        &                   tl_dom1 ) 
     1278 
    8921279                        ! clean extra point information on coarse grid domain 
    8931280                        CALL dom_clean_extra( tl_dom0 ) 
     
    9641351            !-  
    9651352            CALL create_boundary_get_coord( tl_coord1, tl_segdom1(jp_T,jk,jl),& 
    966             &                               'T', tl_lon1, tl_lat1 ) 
     1353               &                           'T', tl_lon1, tl_lat1 ) 
    9671354 
    9681355            ! force to use nav_lon, nav_lat as variable name 
     
    11021489            CALL file_add_att(tl_fileout, tl_att) 
    11031490 
     1491            !add source url 
     1492            cl_url=fct_split(fct_split(cp_url,2,'$'),2,'URL:') 
     1493            tl_att=att_init("SIREN_url",cl_url) 
     1494            CALL file_add_att(tl_fileout, tl_att) 
     1495 
     1496            ! add date of creation 
    11041497            cl_date=date_print(date_now()) 
    11051498            tl_att=att_init("Creation_date",cl_date) 
     
    11711564   CALL logger_clean() 
    11721565 
    1173 END SUBROUTINE create__boundary 
     1566   END SUBROUTINE create_boundary__mono 
     1567   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1568   FUNCTION create_boundary_get_dom(td_bathy1, td_bdy, id_seg) & 
     1569         & RESULT (tf_dom) 
    11741570   !------------------------------------------------------------------- 
    11751571   !> @brief 
     
    11861582   !> @return array of domain structure  
    11871583   !------------------------------------------------------------------- 
    1188    FUNCTION create_boundary_get_dom( td_bathy1, td_bdy, id_seg ) 
    11891584 
    11901585      IMPLICIT NONE 
     
    11961591 
    11971592      ! function 
    1198       TYPE(TDOM), DIMENSION(ip_npoint) :: create_boundary_get_dom 
     1593      TYPE(TDOM), DIMENSION(ip_npoint) :: tf_dom 
    11991594 
    12001595      ! local variable 
     
    12711666 
    12721667         ! compute domain 
    1273          create_boundary_get_dom(ji)=dom_init( td_bathy1,       & 
    1274          &                                     il_imin, il_imax,& 
    1275          &                                     il_jmin, il_jmax,& 
    1276          &                                     TRIM(td_bdy%c_card) ) 
     1668         tf_dom(ji)=dom_init(td_bathy1,         & 
     1669            &                il_imin, il_imax,  & 
     1670            &                il_jmin, il_jmax,  & 
     1671            &                TRIM(td_bdy%c_card)) 
    12771672 
    12781673      ENDDO 
    12791674 
    12801675   END FUNCTION create_boundary_get_dom 
     1676   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1677   SUBROUTINE create_boundary_get_coord(td_coord1, td_dom1, cd_point, & 
     1678      &                                 td_lon1, td_lat1) 
    12811679   !------------------------------------------------------------------- 
    12821680   !> @brief 
     
    12941692   !> @param[out] td_lat1  latitude variable structure 
    12951693   !------------------------------------------------------------------- 
    1296    SUBROUTINE create_boundary_get_coord( td_coord1, td_dom1, cd_point, & 
    1297    &                                     td_lon1, td_lat1 ) 
    12981694 
    12991695      IMPLICIT NONE 
     1696 
    13001697      ! Argument 
    13011698      TYPE(TMPP)      , INTENT(IN   ) :: td_coord1 
     
    13311728 
    13321729   END SUBROUTINE create_boundary_get_coord 
     1730   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1731   SUBROUTINE create_boundary_interp(td_var, id_rho, id_offset, & 
     1732         &                           id_iext, id_jext) 
    13331733   !------------------------------------------------------------------- 
    13341734   !> @brief 
     
    13461746   !> @param[in] id_jext   j-direction size of extra bands (default=im_minext) 
    13471747   !------------------------------------------------------------------- 
    1348    SUBROUTINE create_boundary_interp( td_var,           & 
    1349    &                                  id_rho,           & 
    1350    &                                  id_offset,        & 
    1351    &                                  id_iext, id_jext ) 
    13521748 
    13531749      IMPLICIT NONE 
     
    13941790      CALL extrap_fill_value( td_var ) 
    13951791 
    1396       ! interpolate Bathymetry 
     1792      ! interpolate variable 
    13971793      CALL interp_fill_value( td_var, id_rho(:), & 
    13981794      &                       id_offset=id_offset(:,:) ) 
     
    14031799 
    14041800   END SUBROUTINE create_boundary_interp 
     1801   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1802   FUNCTION create_boundary_matrix(td_var, td_dom, id_nlevel) & 
     1803         & RESULT (tf_var) 
    14051804   !------------------------------------------------------------------- 
    14061805   !> @brief 
     
    14211820   !> @return variable structure  
    14221821   !------------------------------------------------------------------- 
    1423    FUNCTION create_boundary_matrix(td_var, td_dom, id_nlevel) 
     1822 
    14241823      IMPLICIT NONE 
     1824 
    14251825      ! Argument 
    14261826      TYPE(TVAR) , INTENT(IN) :: td_var 
     
    14291829 
    14301830      ! function 
    1431       TYPE(TVAR) :: create_boundary_matrix 
     1831      TYPE(TVAR)              :: tf_var 
    14321832 
    14331833      ! local variable 
     
    15071907 
    15081908      ! initialise variable with value 
    1509       create_boundary_matrix=var_init(TRIM(td_var%c_name),dl_value(:,:,:,:)) 
     1909      tf_var=var_init(TRIM(td_var%c_name),dl_value(:,:,:,:)) 
    15101910 
    15111911      DEALLOCATE(dl_value) 
    15121912 
    15131913   END FUNCTION create_boundary_matrix 
     1914   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1915   SUBROUTINE create_boundary_use_mask(td_var, td_mask) 
    15141916   !------------------------------------------------------------------- 
    15151917   !> @brief 
     
    15241926   !> @param[in] td_mask   mask variable structure 
    15251927   !------------------------------------------------------------------- 
    1526    SUBROUTINE create_boundary_use_mask( td_var, td_mask ) 
    15271928 
    15281929      IMPLICIT NONE 
     
    15661967 
    15671968   END SUBROUTINE create_boundary_use_mask 
     1969   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1970   FUNCTION create_boundary_get_level(td_level, td_dom) & 
     1971         & RESULT (tf_var) 
    15681972   !------------------------------------------------------------------- 
    15691973   !> @brief 
     
    15781982   !> @return array of variable structure 
    15791983   !------------------------------------------------------------------- 
    1580    FUNCTION create_boundary_get_level(td_level, td_dom) 
     1984 
    15811985      IMPLICIT NONE 
     1986 
    15821987      ! Argument 
    15831988      TYPE(TVAR), DIMENSION(:), INTENT(IN) :: td_level 
     
    15851990 
    15861991      ! function 
    1587       TYPE(TVAR), DIMENSION(ip_npoint) :: create_boundary_get_level 
     1992      TYPE(TVAR), DIMENSION(ip_npoint)     :: tf_var 
    15881993 
    15891994      ! local variable 
    1590       TYPE(TVAR), DIMENSION(ip_npoint) :: tl_var 
    1591  
    15921995      ! loop indices 
    15931996      INTEGER(i4) :: ji 
     
    16022005         DO ji=1,ip_npoint 
    16032006 
    1604             tl_var(ji)=var_copy(td_level(ji)) 
    1605  
    1606             IF( ASSOCIATED(tl_var(ji)%d_value) ) DEALLOCATE(tl_var(ji)%d_value) 
    1607  
    1608             tl_var(ji)%t_dim(1)%i_len=td_dom(ji)%t_dim(1)%i_len 
    1609             tl_var(ji)%t_dim(2)%i_len=td_dom(ji)%t_dim(2)%i_len 
    1610             ALLOCATE(tl_var(ji)%d_value(tl_var(ji)%t_dim(1)%i_len, & 
    1611             &                           tl_var(ji)%t_dim(2)%i_len, & 
    1612             &                           tl_var(ji)%t_dim(3)%i_len, & 
    1613             &                           tl_var(ji)%t_dim(4)%i_len) ) 
    1614  
    1615             tl_var(ji)%d_value(:,:,:,:) = & 
     2007            tf_var(ji)=var_copy(td_level(ji)) 
     2008 
     2009            IF( ASSOCIATED(tf_var(ji)%d_value) ) DEALLOCATE(tf_var(ji)%d_value) 
     2010 
     2011            tf_var(ji)%t_dim(1)%i_len=td_dom(ji)%t_dim(1)%i_len 
     2012            tf_var(ji)%t_dim(2)%i_len=td_dom(ji)%t_dim(2)%i_len 
     2013            ALLOCATE(tf_var(ji)%d_value(tf_var(ji)%t_dim(1)%i_len, & 
     2014            &                           tf_var(ji)%t_dim(2)%i_len, & 
     2015            &                           tf_var(ji)%t_dim(3)%i_len, & 
     2016            &                           tf_var(ji)%t_dim(4)%i_len) ) 
     2017 
     2018            tf_var(ji)%d_value(:,:,:,:) = & 
    16162019            &  td_level(ji)%d_value( td_dom(ji)%i_imin:td_dom(ji)%i_imax, & 
    16172020            &                        td_dom(ji)%i_jmin:td_dom(ji)%i_jmax, :, : ) 
    16182021 
    16192022         ENDDO 
    1620          ! save result 
    1621          create_boundary_get_level(:)=var_copy(tl_var(:)) 
    1622  
    1623          ! clean 
    1624          CALL var_clean(tl_var(:)) 
    16252023 
    16262024      ENDIF 
    16272025 
    16282026   END FUNCTION create_boundary_get_level 
     2027   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2028   SUBROUTINE create_boundary_check_depth(td_var, td_mpp, id_nlevel, td_depth) 
    16292029   !------------------------------------------------------------------- 
    16302030   !> @brief 
     
    16452045   !> @param[inout] td_depth  depth variable structure  
    16462046   !------------------------------------------------------------------- 
    1647    SUBROUTINE create_boundary_check_depth( td_var, td_mpp, id_nlevel, td_depth ) 
    16482047 
    16492048      IMPLICIT NONE 
     
    17052104       
    17062105   END SUBROUTINE create_boundary_check_depth 
     2106   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2107   SUBROUTINE create_boundary_check_time(td_var, td_mpp, td_time) 
    17072108   !------------------------------------------------------------------- 
    17082109   !> @brief 
     
    17222123   !> @param[inout] td_time  time variable structure  
    17232124   !------------------------------------------------------------------- 
    1724    SUBROUTINE create_boundary_check_time( td_var, td_mpp, td_time ) 
    17252125 
    17262126      IMPLICIT NONE 
     
    17442144      & )THEN 
    17452145 
    1746          ! get or check depth value 
     2146         ! get or check time value 
    17472147         IF( td_mpp%t_proc(1)%i_timeid /= 0 )THEN 
    17482148 
     
    17752175 
    17762176   END SUBROUTINE create_boundary_check_time 
     2177   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    17772178END PROGRAM create_boundary 
Note: See TracChangeset for help on using the changeset viewer.