Changeset 12080


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

update nemo trunk

Location:
utils/tools/SIREN
Files:
5 added
6 deleted
47 edited

Legend:

Unmodified
Added
Removed
  • utils/tools/SIREN/Doxyfile

    • Property svn:keywords set to Rev
    r7646 r12080  
    1 # Doxyfile 1.8.8 
     1# Doxyfile 1.8.15 
    22 
    33# This file describes the settings to be used by the documentation system 
     
    1818#--------------------------------------------------------------------------- 
    1919 
    20 # This tag specifies the encoding used for all characters in the config file 
    21 # that follow. The default is UTF-8 which is also the encoding used for all text 
    22 # before the first occurrence of this tag. Doxygen uses libiconv (or the iconv 
    23 # built into libc) for the transcoding. See http://www.gnu.org/software/libiconv 
    24 # for the list of possible encodings. 
     20# This tag specifies the encoding used for all characters in the configuration 
     21# file that follow. The default is UTF-8 which is also the encoding used for all 
     22# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
     23# iconv built into libc) for the transcoding. See 
     24# https://www.gnu.org/software/libiconv/ for the list of possible encodings. 
    2525# The default value is: UTF-8. 
    2626 
     
    3939# control system is used. 
    4040 
    41 PROJECT_NUMBER         = "NEMO 3.6" 
     41PROJECT_NUMBER         = "$Rev$" 
    4242 
    4343# Using the PROJECT_BRIEF tag one can provide an optional one line description 
     
    4747PROJECT_BRIEF          = "System and Interface for oceanic RElocatable Nesting" 
    4848 
    49 # With the PROJECT_LOGO tag one can specify an logo or icon that is included in 
    50 # the documentation. The maximum height of the logo should not exceed 55 pixels 
    51 # and the maximum width should not exceed 200 pixels. Doxygen will copy the logo 
    52 # to the output directory. 
     49# With the PROJECT_LOGO tag one can specify a logo or an icon that is included 
     50# in the documentation. The maximum height of the logo should not exceed 55 
     51# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy 
     52# the logo to the output directory. 
    5353 
    5454PROJECT_LOGO           = ./src/docsrc/Image/logoSirenNemo.png 
     
    6161OUTPUT_DIRECTORY       = ./doc 
    6262 
    63 # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- 
     63# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- 
    6464# directories (in 2 levels) under the output directory of each output format and 
    6565# will distribute the generated files over these directories. Enabling this 
     
    9494OUTPUT_LANGUAGE        = English 
    9595 
    96 # If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member 
     96# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all 
     97# documentation generated by doxygen is written. Doxygen will use this 
     98# information to generate all generated output in the proper direction. 
     99# Possible values are: None, LTR, RTL and Context. 
     100# The default value is: None. 
     101 
     102OUTPUT_TEXT_DIRECTION  = None 
     103 
     104# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member 
    97105# descriptions after the members that are listed in the file and class 
    98106# documentation (similar to Javadoc). Set to NO to disable this. 
     
    101109BRIEF_MEMBER_DESC      = YES 
    102110 
    103 # If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief 
     111# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief 
    104112# description of a member or function before the detailed description 
    105113# 
     
    136144INLINE_INHERITED_MEMB  = NO 
    137145 
    138 # If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path 
     146# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path 
    139147# before files name in the file list and in the header files. If set to NO the 
    140148# shortest path that makes the file name unique will be used 
     
    206214INHERIT_DOCS           = YES 
    207215 
    208 # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a 
    209 # new page for each member. If set to NO, the documentation of a member will be 
    210 # part of the file/class/namespace that contains it. 
     216# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new 
     217# page for each member. If set to NO, the documentation of a member will be part 
     218# of the file/class/namespace that contains it. 
    211219# The default value is: NO. 
    212220 
     
    227235# documentation, which will result in a user-defined paragraph with heading 
    228236# "Side Effects:". You can put \n's in the value part of an alias to insert 
    229 # newlines. 
     237# newlines (in the resulting output). You can put ^^ in the value part of an 
     238# alias to insert a newline as if a physical newline was in the original file. 
     239# When you need a literal { or } or , in the value part of an alias you have to 
     240# escape them by means of a backslash (\), this can lead to conflicts with the 
     241# commands \{ and \} for these it is advised to use the version @{ and @} or use 
     242# a double escape (\\{ and \\}) 
    230243 
    231244ALIASES                = 
     
    264277 
    265278OPTIMIZE_OUTPUT_VHDL   = NO 
     279 
     280# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice 
     281# sources only. Doxygen will then generate output that is more tailored for that 
     282# language. For instance, namespaces will be presented as modules, types will be 
     283# separated into more groups, etc. 
     284# The default value is: NO. 
     285 
     286OPTIMIZE_OUTPUT_SLICE  = NO 
    266287 
    267288# Doxygen selects the parser to use depending on the extension of the files it 
     
    270291# using this tag. The format is ext=language, where ext is a file extension, and 
    271292# language is one of the parsers supported by doxygen: IDL, Java, Javascript, 
    272 # C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: 
    273 # FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: 
    274 # Fortran. In the later case the parser tries to guess whether the code is fixed 
    275 # or free formatted code, this is the default for Fortran type files), VHDL. For 
    276 # instance to make doxygen treat .inc files as Fortran files (default is PHP), 
    277 # and .f files as C (default is Fortran), use: inc=Fortran f=C. 
    278 # 
    279 # Note For files without extension you can use no_extension as a placeholder. 
     293# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, 
     294# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: 
     295# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser 
     296# tries to guess whether the code is fixed or free formatted code, this is the 
     297# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat 
     298# .inc files as Fortran files (default is PHP), and .f files as C (default is 
     299# Fortran), use: inc=Fortran f=C. 
     300# 
     301# Note: For files without extension you can use no_extension as a placeholder. 
    280302# 
    281303# Note that for custom extensions you also need to set FILE_PATTERNS otherwise 
    282304# the files are not read by doxygen. 
    283305 
    284 EXTENSION_MAPPING      =  
     306EXTENSION_MAPPING      = 
    285307 
    286308# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments 
    287309# according to the Markdown format, which allows for more readable 
    288 # documentation. See http://daringfireball.net/projects/markdown/ for details. 
     310# documentation. See https://daringfireball.net/projects/markdown/ for details. 
    289311# The output of markdown processing is further processed by doxygen, so you can 
    290312# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in 
     
    294316MARKDOWN_SUPPORT       = YES 
    295317 
     318# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up 
     319# to that level are automatically included in the table of contents, even if 
     320# they do not have an id attribute. 
     321# Note: This feature currently applies only to Markdown headings. 
     322# Minimum value: 0, maximum value: 99, default value: 0. 
     323# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. 
     324 
     325TOC_INCLUDE_HEADINGS   = 0 
     326 
    296327# When enabled doxygen tries to link words that correspond to documented 
    297328# classes, or namespaces to their corresponding documentation. Such a link can 
    298 # be prevented in individual cases by by putting a % sign in front of the word 
    299 # or globally by setting AUTOLINK_SUPPORT to NO. 
     329# be prevented in individual cases by putting a % sign in front of the word or 
     330# globally by setting AUTOLINK_SUPPORT to NO. 
    300331# The default value is: YES. 
    301332 
     
    319350 
    320351# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: 
    321 # http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen 
     352# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen 
    322353# will parse them like normal C++ but will assume all classes use public instead 
    323354# of private inheritance when no explicit protection keyword is present. 
     
    337368 
    338369# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
    339 # tag is set to YES, then doxygen will reuse the documentation of the first 
     370# tag is set to YES then doxygen will reuse the documentation of the first 
    340371# member in the group (if any) for the other members of the group. By default 
    341372# all members of a group must be documented explicitly. 
     
    343374 
    344375DISTRIBUTE_GROUP_DOC   = NO 
     376 
     377# If one adds a struct or class to a group and this option is enabled, then also 
     378# any nested class or struct is added to the same group. By default this option 
     379# is disabled and one has to add nested compounds explicitly via \ingroup. 
     380# The default value is: NO. 
     381 
     382GROUP_NESTED_COMPOUNDS = NO 
    345383 
    346384# Set the SUBGROUPING tag to YES to allow class member groups of the same type 
     
    402440#--------------------------------------------------------------------------- 
    403441 
    404 # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
     442# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in 
    405443# documentation are documented, even if no documentation was available. Private 
    406444# class members and static file members will be hidden unless the 
     
    412450EXTRACT_ALL            = NO 
    413451 
    414 # If the EXTRACT_PRIVATE tag is set to YES all private members of a class will 
     452# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will 
    415453# be included in the documentation. 
    416454# The default value is: NO. 
     
    418456EXTRACT_PRIVATE        = NO 
    419457 
    420 # If the EXTRACT_PACKAGE tag is set to YES all members with package or internal 
     458# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal 
    421459# scope will be included in the documentation. 
    422460# The default value is: NO. 
     
    424462EXTRACT_PACKAGE        = NO 
    425463 
    426 # If the EXTRACT_STATIC tag is set to YES all static members of a file will be 
     464# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be 
    427465# included in the documentation. 
    428466# The default value is: NO. 
     
    430468EXTRACT_STATIC         = NO 
    431469 
    432 # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined 
    433 # locally in source files will be included in the documentation. If set to NO 
     470# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined 
     471# locally in source files will be included in the documentation. If set to NO, 
    434472# only classes defined in header files are included. Does not have any effect 
    435473# for Java sources. 
     
    438476EXTRACT_LOCAL_CLASSES  = YES 
    439477 
    440 # This flag is only useful for Objective-C code. When set to YES local methods, 
     478# This flag is only useful for Objective-C code. If set to YES, local methods, 
    441479# which are defined in the implementation section but not in the interface are 
    442 # included in the documentation. If set to NO only methods in the interface are 
     480# included in the documentation. If set to NO, only methods in the interface are 
    443481# included. 
    444482# The default value is: NO. 
     
    465503# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all 
    466504# undocumented classes that are normally visible in the class hierarchy. If set 
    467 # to NO these classes will be included in the various overviews. This option has 
    468 # no effect if EXTRACT_ALL is enabled. 
     505# to NO, these classes will be included in the various overviews. This option 
     506# has no effect if EXTRACT_ALL is enabled. 
    469507# The default value is: NO. 
    470508 
     
    472510 
    473511# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend 
    474 # (class|struct|union) declarations. If set to NO these declarations will be 
     512# (class|struct|union) declarations. If set to NO, these declarations will be 
    475513# included in the documentation. 
    476514# The default value is: NO. 
     
    479517 
    480518# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any 
    481 # documentation blocks found inside the body of a function. If set to NO these 
     519# documentation blocks found inside the body of a function. If set to NO, these 
    482520# blocks will be appended to the function's detailed documentation block. 
    483521# The default value is: NO. 
     
    493531 
    494532# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file 
    495 # names in lower-case letters. If set to YES upper-case letters are also 
     533# names in lower-case letters. If set to YES, upper-case letters are also 
    496534# allowed. This is useful if you have classes or files whose names only differ 
    497535# in case and if your file system supports case sensitive file names. Windows 
     
    502540 
    503541# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with 
    504 # their full class and namespace scopes in the documentation. If set to YES the 
     542# their full class and namespace scopes in the documentation. If set to YES, the 
    505543# scope will be hidden. 
    506544# The default value is: NO. 
    507545 
    508546HIDE_SCOPE_NAMES       = NO 
     547 
     548# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will 
     549# append additional text to a page's title, such as Class Reference. If set to 
     550# YES the compound reference will be hidden. 
     551# The default value is: NO. 
     552 
     553HIDE_COMPOUND_REFERENCE= NO 
    509554 
    510555# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of 
     
    535580# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the 
    536581# (detailed) documentation of file and class members alphabetically by member 
    537 # name. If set to NO the members will appear in declaration order. 
     582# name. If set to NO, the members will appear in declaration order. 
    538583# The default value is: YES. 
    539584 
     
    542587# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief 
    543588# descriptions of file, namespace and class members alphabetically by member 
    544 # name. If set to NO the members will appear in declaration order. Note that 
     589# name. If set to NO, the members will appear in declaration order. Note that 
    545590# this will also influence the order of the classes in the class list. 
    546591# The default value is: NO. 
     
    587632STRICT_PROTO_MATCHING  = NO 
    588633 
    589 # The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the 
    590 # todo list. This list is created by putting \todo commands in the 
    591 # documentation. 
     634# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo 
     635# list. This list is created by putting \todo commands in the documentation. 
    592636# The default value is: YES. 
    593637 
    594638GENERATE_TODOLIST      = YES 
    595639 
    596 # The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the 
    597 # test list. This list is created by putting \test commands in the 
    598 # documentation. 
     640# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test 
     641# list. This list is created by putting \test commands in the documentation. 
    599642# The default value is: YES. 
    600643 
    601644GENERATE_TESTLIST      = YES 
    602645 
    603 # The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug 
     646# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug 
    604647# list. This list is created by putting \bug commands in the documentation. 
    605648# The default value is: YES. 
     
    607650GENERATE_BUGLIST       = YES 
    608651 
    609 # The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) 
     652# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) 
    610653# the deprecated list. This list is created by putting \deprecated commands in 
    611654# the documentation. 
     
    632675 
    633676# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at 
    634 # the bottom of the documentation of classes and structs. If set to YES the list 
    635 # will mention the files that were used to generate the documentation. 
     677# the bottom of the documentation of classes and structs. If set to YES, the 
     678# list will mention the files that were used to generate the documentation. 
    636679# The default value is: YES. 
    637680 
     
    678721# the reference definitions. This must be a list of .bib files. The .bib 
    679722# extension is automatically appended if omitted. This requires the bibtex tool 
    680 # to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. 
     723# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. 
    681724# For LaTeX the style of the bibliography can be controlled using 
    682725# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the 
     
    697740 
    698741# The WARNINGS tag can be used to turn on/off the warning messages that are 
    699 # generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES 
     742# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES 
    700743# this implies that the warnings are on. 
    701744# 
     
    705748WARNINGS               = YES 
    706749 
    707 # If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate 
     750# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate 
    708751# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag 
    709752# will automatically be disabled. 
     
    722765# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that 
    723766# are documented, but have no documentation for their parameters or return 
    724 # value. If set to NO doxygen will only warn about wrong or incomplete parameter 
    725 # documentation, but not about the absence of documentation. 
     767# value. If set to NO, doxygen will only warn about wrong or incomplete 
     768# parameter documentation, but not about the absence of documentation. If 
     769# EXTRACT_ALL is set to YES then this flag will automatically be disabled. 
    726770# The default value is: NO. 
    727771 
    728772WARN_NO_PARAMDOC       = NO 
     773 
     774# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when 
     775# a warning is encountered. 
     776# The default value is: NO. 
     777 
     778WARN_AS_ERROR          = NO 
    729779 
    730780# The WARN_FORMAT tag determines the format of the warning messages that doxygen 
     
    751801# documented source files. You may enter file names like myfile.cpp or 
    752802# directories like /usr/src/myproject. Separate the files or directories with 
    753 # spaces. 
     803# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING 
    754804# Note: If this tag is empty the current directory is searched. 
    755805 
    756 INPUT                  = ./src ./src/docsrc 
     806INPUT                  = ./src \ 
     807                         ./src/docsrc 
    757808 
    758809# This tag can be used to specify the character encoding of the source files 
    759810# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses 
    760811# libiconv (or the iconv built into libc) for the transcoding. See the libiconv 
    761 # documentation (see: http://www.gnu.org/software/libiconv) for the list of 
     812# documentation (see: https://www.gnu.org/software/libiconv/) for the list of 
    762813# possible encodings. 
    763814# The default value is: UTF-8. 
     
    767818# If the value of the INPUT tag contains directories, you can use the 
    768819# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and 
    769 # *.h) to filter out the source-files in the directories. If left blank the 
    770 # following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, 
    771 # *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, 
    772 # *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, 
    773 # *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, 
    774 # *.qsf, *.as and *.js. 
    775  
    776 FILE_PATTERNS          =  
     820# *.h) to filter out the source-files in the directories. 
     821# 
     822# Note that for custom extensions or not directly supported extensions you also 
     823# need to set EXTENSION_MAPPING for the extension otherwise the files are not 
     824# read by doxygen. 
     825# 
     826# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, 
     827# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, 
     828# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, 
     829# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, 
     830# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. 
     831 
     832FILE_PATTERNS          = *.f90 \ 
     833                         *.F90 \ 
     834                         *.md \ 
     835                         *.dox 
    777836 
    778837# The RECURSIVE tag can be used to specify whether or not subdirectories should 
     
    822881# command). 
    823882 
    824 EXAMPLE_PATH           = 
     883EXAMPLE_PATH           = ./src/docsrc/include/ \ 
     884                         ./src/docsrc/include/namlog \ 
     885                         ./src/docsrc/include/namcfg \ 
     886                         ./src/docsrc/include/namsrc \ 
     887                         ./src/docsrc/include/namtgt \ 
     888                         ./src/docsrc/include/namvar \ 
     889                         ./src/docsrc/include/namnst \ 
     890                         ./src/docsrc/include/namout 
    825891 
    826892# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
     
    858924# code is scanned, but not when the output code is generated. If lines are added 
    859925# or removed, the anchors will not be placed correctly. 
     926# 
     927# Note that for custom extensions or not directly supported extensions you also 
     928# need to set EXTENSION_MAPPING for the extension otherwise the files are not 
     929# properly processed by doxygen. 
    860930 
    861931INPUT_FILTER           = 
     
    867937# filters are used. If the FILTER_PATTERNS tag is empty or if none of the 
    868938# patterns match the file name, INPUT_FILTER is applied. 
     939# 
     940# Note that for custom extensions or not directly supported extensions you also 
     941# need to set EXTENSION_MAPPING for the extension otherwise the files are not 
     942# properly processed by doxygen. 
    869943 
    870944FILTER_PATTERNS        = 
    871945 
    872946# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
    873 # INPUT_FILTER ) will also be used to filter the input files that are used for 
     947# INPUT_FILTER) will also be used to filter the input files that are used for 
    874948# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). 
    875949# The default value is: NO. 
     
    919993 
    920994# If the REFERENCED_BY_RELATION tag is set to YES then for each documented 
    921 # function all documented functions referencing it will be listed. 
     995# entity all documented functions referencing it will be listed. 
    922996# The default value is: NO. 
    923997 
     
    9311005 
    9321006# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set 
    933 # to YES, then the hyperlinks from functions in REFERENCES_RELATION and 
     1007# to YES then the hyperlinks from functions in REFERENCES_RELATION and 
    9341008# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will 
    9351009# link to the documentation. 
     
    9511025# point to the HTML generated by the htags(1) tool instead of doxygen built-in 
    9521026# source browser. The htags tool is part of GNU's global source tagging system 
    953 # (see http://www.gnu.org/software/global/global.html). You will need version 
     1027# (see https://www.gnu.org/software/global/global.html). You will need version 
    9541028# 4.8.6 or higher. 
    9551029# 
    9561030# To use it do the following: 
    9571031# - Install the latest version of global 
    958 # - Enable SOURCE_BROWSER and USE_HTAGS in the config file 
     1032# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file 
    9591033# - Make sure the INPUT points to the root of the source tree 
    9601034# - Run doxygen as normal 
     
    10081082#--------------------------------------------------------------------------- 
    10091083 
    1010 # If the GENERATE_HTML tag is set to YES doxygen will generate HTML output 
     1084# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output 
    10111085# The default value is: YES. 
    10121086 
     
    10741148# created by doxygen. Using this option one can overrule certain style aspects. 
    10751149# This is preferred over using HTML_STYLESHEET since it does not replace the 
    1076 # standard style sheet and is therefor more robust against future updates. 
     1150# standard style sheet and is therefore more robust against future updates. 
    10771151# Doxygen will copy the style sheet files to the output directory. 
    1078 # Note: The order of the extra stylesheet files is of importance (e.g. the last 
    1079 # stylesheet in the list overrules the setting of the previous ones in the 
     1152# Note: The order of the extra style sheet files is of importance (e.g. the last 
     1153# style sheet in the list overrules the setting of the previous ones in the 
    10801154# list). For an example see the documentation. 
    10811155# This tag requires that the tag GENERATE_HTML is set to YES. 
     
    10941168 
    10951169# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen 
    1096 # will adjust the colors in the stylesheet and background images according to 
     1170# will adjust the colors in the style sheet and background images according to 
    10971171# this color. Hue is specified as an angle on a colorwheel, see 
    1098 # http://en.wikipedia.org/wiki/Hue for more information. For instance the value 
     1172# https://en.wikipedia.org/wiki/Hue for more information. For instance the value 
    10991173# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 
    11001174# purple, and 360 is red again. 
     
    11251199# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 
    11261200# page will contain the date and time when the page was generated. Setting this 
    1127 # to NO can help when comparing the output of multiple runs. 
    1128 # The default value is: YES. 
     1201# to YES can help to show when doxygen was last run and thus if the 
     1202# documentation is up to date. 
     1203# The default value is: NO. 
    11291204# This tag requires that the tag GENERATE_HTML is set to YES. 
    11301205 
    11311206HTML_TIMESTAMP         = YES 
     1207 
     1208# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML 
     1209# documentation will contain a main index with vertical navigation menus that 
     1210# are dynamically created via Javascript. If disabled, the navigation index will 
     1211# consists of multiple levels of tabs that are statically embedded in every HTML 
     1212# page. Disable this option to support browsers that do not have Javascript, 
     1213# like the Qt help browser. 
     1214# The default value is: YES. 
     1215# This tag requires that the tag GENERATE_HTML is set to YES. 
     1216 
     1217HTML_DYNAMIC_MENUS     = YES 
    11321218 
    11331219# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
     
    11541240# If the GENERATE_DOCSET tag is set to YES, additional index files will be 
    11551241# generated that can be used as input for Apple's Xcode 3 integrated development 
    1156 # environment (see: http://developer.apple.com/tools/xcode/), introduced with 
    1157 # OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a 
     1242# environment (see: https://developer.apple.com/xcode/), introduced with OSX 
     1243# 10.5 (Leopard). To create a documentation set, doxygen will generate a 
    11581244# Makefile in the HTML output directory. Running make will produce the docset in 
    11591245# that directory and running make install will install the docset in 
    11601246# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at 
    1161 # startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html 
    1162 # for more information. 
     1247# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy 
     1248# genXcode/_index.html for more information. 
    11631249# The default value is: NO. 
    11641250# This tag requires that the tag GENERATE_HTML is set to YES. 
     
    11991285# additional HTML index files: index.hhp, index.hhc, and index.hhk. The 
    12001286# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop 
    1201 # (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on 
     1287# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on 
    12021288# Windows. 
    12031289# 
     
    12221308 
    12231309# The HHC_LOCATION tag can be used to specify the location (absolute path 
    1224 # including file name) of the HTML help compiler ( hhc.exe). If non-empty 
     1310# including file name) of the HTML help compiler (hhc.exe). If non-empty, 
    12251311# doxygen will try to run the HTML help compiler on the generated index.hhp. 
    12261312# The file has to be specified with full path. 
     
    12291315HHC_LOCATION           = 
    12301316 
    1231 # The GENERATE_CHI flag controls if a separate .chi index file is generated ( 
    1232 # YES) or that it should be included in the master .chm file ( NO). 
     1317# The GENERATE_CHI flag controls if a separate .chi index file is generated 
     1318# (YES) or that it should be included in the master .chm file (NO). 
    12331319# The default value is: NO. 
    12341320# This tag requires that the tag GENERATE_HTMLHELP is set to YES. 
     
    12361322GENERATE_CHI           = NO 
    12371323 
    1238 # The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) 
     1324# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) 
    12391325# and project file content. 
    12401326# This tag requires that the tag GENERATE_HTMLHELP is set to YES. 
     
    12421328CHM_INDEX_ENCODING     = 
    12431329 
    1244 # The BINARY_TOC flag controls whether a binary table of contents is generated ( 
    1245 # YES) or a normal table of contents ( NO) in the .chm file. Furthermore it 
     1330# The BINARY_TOC flag controls whether a binary table of contents is generated 
     1331# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it 
    12461332# enables the Previous and Next buttons. 
    12471333# The default value is: NO. 
     
    12751361# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help 
    12761362# Project output. For more information please see Qt Help Project / Namespace 
    1277 # (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). 
     1363# (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). 
    12781364# The default value is: org.doxygen.Project. 
    12791365# This tag requires that the tag GENERATE_QHP is set to YES. 
     
    12831369# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt 
    12841370# Help Project output. For more information please see Qt Help Project / Virtual 
    1285 # Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- 
     1371# Folders (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- 
    12861372# folders). 
    12871373# The default value is: doc. 
     
    12921378# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom 
    12931379# filter to add. For more information please see Qt Help Project / Custom 
    1294 # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- 
     1380# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- 
    12951381# filters). 
    12961382# This tag requires that the tag GENERATE_QHP is set to YES. 
     
    13001386# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the 
    13011387# custom filter to add. For more information please see Qt Help Project / Custom 
    1302 # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- 
     1388# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- 
    13031389# filters). 
    13041390# This tag requires that the tag GENERATE_QHP is set to YES. 
     
    13081394# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this 
    13091395# project's filter section matches. Qt Help Project / Filter Attributes (see: 
    1310 # http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). 
     1396# http://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). 
    13111397# This tag requires that the tag GENERATE_QHP is set to YES. 
    13121398 
     
    13571443# to work a browser that supports JavaScript, DHTML, CSS and frames is required 
    13581444# (i.e. any modern browser). Windows users are probably better off using the 
    1359 # HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can 
     1445# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can 
    13601446# further fine-tune the look of the index. As an example, the default style 
    13611447# sheet generated by doxygen has an example that shows how to put an image at 
     
    13851471TREEVIEW_WIDTH         = 250 
    13861472 
    1387 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to 
     1473# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to 
    13881474# external symbols imported via tag files in a separate window. 
    13891475# The default value is: NO. 
     
    14011487FORMULA_FONTSIZE       = 10 
    14021488 
    1403 # Use the FORMULA_TRANPARENT tag to determine whether or not the images 
     1489# Use the FORMULA_TRANSPARENT tag to determine whether or not the images 
    14041490# generated for formulas are transparent PNGs. Transparent PNGs are not 
    14051491# supported properly for IE 6.0, but are supported on all modern browsers. 
     
    14131499 
    14141500# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see 
    1415 # http://www.mathjax.org) which uses client side Javascript for the rendering 
    1416 # instead of using prerendered bitmaps. Use this if you do not have LaTeX 
     1501# https://www.mathjax.org) which uses client side Javascript for the rendering 
     1502# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX 
    14171503# installed or if you want to formulas look prettier in the HTML output. When 
    14181504# enabled you may also need to install MathJax separately and configure the path 
     
    14401526# Content Delivery Network so you can quickly see the result without installing 
    14411527# MathJax. However, it is strongly recommended to install a local copy of 
    1442 # MathJax from http://www.mathjax.org before deployment. 
    1443 # The default value is: http://cdn.mathjax.org/mathjax/latest. 
     1528# MathJax from https://www.mathjax.org before deployment. 
     1529# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. 
    14441530# This tag requires that the tag USE_MATHJAX is set to YES. 
    14451531 
     
    15001586# search results. 
    15011587# 
    1502 # Doxygen ships with an example indexer ( doxyindexer) and search engine 
     1588# Doxygen ships with an example indexer (doxyindexer) and search engine 
    15031589# (doxysearch.cgi) which are based on the open source search engine library 
    1504 # Xapian (see: http://xapian.org/). 
     1590# Xapian (see: https://xapian.org/). 
    15051591# 
    15061592# See the section "External Indexing and Searching" for details. 
     
    15131599# which will return the search results when EXTERNAL_SEARCH is enabled. 
    15141600# 
    1515 # Doxygen ships with an example indexer ( doxyindexer) and search engine 
     1601# Doxygen ships with an example indexer (doxyindexer) and search engine 
    15161602# (doxysearch.cgi) which are based on the open source search engine library 
    1517 # Xapian (see: http://xapian.org/). See the section "External Indexing and 
     1603# Xapian (see: https://xapian.org/). See the section "External Indexing and 
    15181604# Searching" for details. 
    15191605# This tag requires that the tag SEARCHENGINE is set to YES. 
     
    15511637#--------------------------------------------------------------------------- 
    15521638 
    1553 # If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output. 
     1639# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. 
    15541640# The default value is: YES. 
    15551641 
     
    15671653# invoked. 
    15681654# 
    1569 # Note that when enabling USE_PDFLATEX this option is only used for generating 
    1570 # bitmaps for formulas in the HTML output, but not in the Makefile that is 
    1571 # written to the output directory. 
    1572 # The default file is: latex. 
     1655# Note that when not enabling USE_PDFLATEX the default is latex when enabling 
     1656# USE_PDFLATEX the default is pdflatex and when in the later case latex is 
     1657# chosen this is overwritten by pdflatex. For specific output languages the 
     1658# default can have been set differently, this depends on the implementation of 
     1659# the output language. 
    15731660# This tag requires that the tag GENERATE_LATEX is set to YES. 
    15741661 
     
    15771664# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate 
    15781665# index for LaTeX. 
     1666# Note: This tag is used in the Makefile / make.bat. 
     1667# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file 
     1668# (.tex). 
    15791669# The default file is: makeindex. 
    15801670# This tag requires that the tag GENERATE_LATEX is set to YES. 
     
    15821672MAKEINDEX_CMD_NAME     = makeindex 
    15831673 
    1584 # If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX 
     1674# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to 
     1675# generate index for LaTeX. 
     1676# Note: This tag is used in the generated output file (.tex). 
     1677# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat. 
     1678# The default value is: \makeindex. 
     1679# This tag requires that the tag GENERATE_LATEX is set to YES. 
     1680 
     1681LATEX_MAKEINDEX_CMD    = \makeindex 
     1682 
     1683# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX 
    15851684# documents. This may be useful for small projects and may help to save some 
    15861685# trees in general. 
     
    16001699 
    16011700# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names 
    1602 # that should be included in the LaTeX output. To get the times font for 
    1603 # instance you can specify 
    1604 # EXTRA_PACKAGES=times 
     1701# that should be included in the LaTeX output. The package can be specified just 
     1702# by its name or with the correct syntax as to be used with the LaTeX 
     1703# \usepackage command. To get the times font for instance you can specify : 
     1704# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times} 
     1705# To use the option intlimits with the amsmath package you can specify: 
     1706# EXTRA_PACKAGES=[intlimits]{amsmath} 
    16051707# If left blank no extra packages will be included. 
    16061708# This tag requires that the tag GENERATE_LATEX is set to YES. 
     
    16171719# following commands have a special meaning inside the header: $title, 
    16181720# $datetime, $date, $doxygenversion, $projectname, $projectnumber, 
    1619 # $projectbrief, $projectlogo. Doxygen will replace $title with the empy string, 
    1620 # for the replacement values of the other commands the user is refered to 
    1621 # HTML_HEADER. 
     1721# $projectbrief, $projectlogo. Doxygen will replace $title with the empty 
     1722# string, for the replacement values of the other commands the user is referred 
     1723# to HTML_HEADER. 
    16221724# This tag requires that the tag GENERATE_LATEX is set to YES. 
    16231725 
     
    16351737LATEX_FOOTER           = 
    16361738 
     1739# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined 
     1740# LaTeX style sheets that are included after the standard style sheets created 
     1741# by doxygen. Using this option one can overrule certain style aspects. Doxygen 
     1742# will copy the style sheet files to the output directory. 
     1743# Note: The order of the extra style sheet files is of importance (e.g. the last 
     1744# style sheet in the list overrules the setting of the previous ones in the 
     1745# list). 
     1746# This tag requires that the tag GENERATE_LATEX is set to YES. 
     1747 
     1748LATEX_EXTRA_STYLESHEET = 
     1749 
    16371750# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or 
    16381751# other source files which should be copied to the LATEX_OUTPUT output 
     
    16531766 
    16541767# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate 
    1655 # the PDF file directly from the LaTeX files. Set this option to YES to get a 
     1768# the PDF file directly from the LaTeX files. Set this option to YES, to get a 
    16561769# higher quality PDF documentation. 
    16571770# The default value is: YES. 
     
    16881801# The LATEX_BIB_STYLE tag can be used to specify the style to use for the 
    16891802# bibliography, e.g. plainnat, or ieeetr. See 
    1690 # http://en.wikipedia.org/wiki/BibTeX and \cite for more info. 
     1803# https://en.wikipedia.org/wiki/BibTeX and \cite for more info. 
    16911804# The default value is: plain. 
    16921805# This tag requires that the tag GENERATE_LATEX is set to YES. 
     
    16941807LATEX_BIB_STYLE        = plain 
    16951808 
     1809# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated 
     1810# page will contain the date and time when the page was generated. Setting this 
     1811# to NO can help when comparing the output of multiple runs. 
     1812# The default value is: NO. 
     1813# This tag requires that the tag GENERATE_LATEX is set to YES. 
     1814 
     1815LATEX_TIMESTAMP        = NO 
     1816 
     1817# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) 
     1818# path from which the emoji images will be read. If a relative path is entered, 
     1819# it will be relative to the LATEX_OUTPUT directory. If left blank the 
     1820# LATEX_OUTPUT directory will be used. 
     1821# This tag requires that the tag GENERATE_LATEX is set to YES. 
     1822 
     1823LATEX_EMOJI_DIRECTORY  = 
     1824 
    16961825#--------------------------------------------------------------------------- 
    16971826# Configuration options related to the RTF output 
    16981827#--------------------------------------------------------------------------- 
    16991828 
    1700 # If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The 
     1829# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The 
    17011830# RTF output is optimized for Word 97 and may not look too pretty with other RTF 
    17021831# readers/editors. 
     
    17131842RTF_OUTPUT             = rtf 
    17141843 
    1715 # If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF 
     1844# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF 
    17161845# documents. This may be useful for small projects and may help to save some 
    17171846# trees in general. 
     
    17331862RTF_HYPERLINKS         = NO 
    17341863 
    1735 # Load stylesheet definitions from file. Syntax is similar to doxygen's config 
    1736 # file, i.e. a series of assignments. You only have to provide replacements, 
    1737 # missing definitions are set to their default value. 
     1864# Load stylesheet definitions from file. Syntax is similar to doxygen's 
     1865# configuration file, i.e. a series of assignments. You only have to provide 
     1866# replacements, missing definitions are set to their default value. 
    17381867# 
    17391868# See also section "Doxygen usage" for information on how to generate the 
     
    17441873 
    17451874# Set optional variables used in the generation of an RTF document. Syntax is 
    1746 # similar to doxygen's config file. A template extensions file can be generated 
    1747 # using doxygen -e rtf extensionFile. 
     1875# similar to doxygen's configuration file. A template extensions file can be 
     1876# generated using doxygen -e rtf extensionFile. 
    17481877# This tag requires that the tag GENERATE_RTF is set to YES. 
    17491878 
    17501879RTF_EXTENSIONS_FILE    = 
    17511880 
     1881# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code 
     1882# with syntax highlighting in the RTF output. 
     1883# 
     1884# Note that which sources are shown also depends on other settings such as 
     1885# SOURCE_BROWSER. 
     1886# The default value is: NO. 
     1887# This tag requires that the tag GENERATE_RTF is set to YES. 
     1888 
     1889RTF_SOURCE_CODE        = NO 
     1890 
    17521891#--------------------------------------------------------------------------- 
    17531892# Configuration options related to the man page output 
    17541893#--------------------------------------------------------------------------- 
    17551894 
    1756 # If the GENERATE_MAN tag is set to YES doxygen will generate man pages for 
     1895# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for 
    17571896# classes and files. 
    17581897# The default value is: NO. 
     
    17981937#--------------------------------------------------------------------------- 
    17991938 
    1800 # If the GENERATE_XML tag is set to YES doxygen will generate an XML file that 
     1939# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that 
    18011940# captures the structure of the code including all documentation. 
    18021941# The default value is: NO. 
     
    18121951XML_OUTPUT             = xml 
    18131952 
    1814 # If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program 
     1953# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program 
    18151954# listings (including syntax highlighting and cross-referencing information) to 
    18161955# the XML output. Note that enabling this will significantly increase the size 
     
    18211960XML_PROGRAMLISTING     = YES 
    18221961 
     1962# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include 
     1963# namespace members in file scope as well, matching the HTML output. 
     1964# The default value is: NO. 
     1965# This tag requires that the tag GENERATE_XML is set to YES. 
     1966 
     1967XML_NS_MEMB_FILE_SCOPE = NO 
     1968 
    18231969#--------------------------------------------------------------------------- 
    18241970# Configuration options related to the DOCBOOK output 
    18251971#--------------------------------------------------------------------------- 
    18261972 
    1827 # If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files 
     1973# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files 
    18281974# that can be used to generate PDF. 
    18291975# The default value is: NO. 
     
    18391985DOCBOOK_OUTPUT         = docbook 
    18401986 
    1841 # If the DOCBOOK_PROGRAMLISTING tag is set to YES doxygen will include the 
     1987# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the 
    18421988# program listings (including syntax highlighting and cross-referencing 
    18431989# information) to the DOCBOOK output. Note that enabling this will significantly 
     
    18521998#--------------------------------------------------------------------------- 
    18531999 
    1854 # If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen 
    1855 # Definitions (see http://autogen.sf.net) file that captures the structure of 
    1856 # the code including all documentation. Note that this feature is still 
    1857 # experimental and incomplete at the moment. 
     2000# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an 
     2001# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures 
     2002# the structure of the code including all documentation. Note that this feature 
     2003# is still experimental and incomplete at the moment. 
    18582004# The default value is: NO. 
    18592005 
     
    18642010#--------------------------------------------------------------------------- 
    18652011 
    1866 # If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module 
     2012# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module 
    18672013# file that captures the structure of the code including all documentation. 
    18682014# 
     
    18722018GENERATE_PERLMOD       = NO 
    18732019 
    1874 # If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary 
     2020# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary 
    18752021# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI 
    18762022# output from the Perl module output. 
     
    18802026PERLMOD_LATEX          = NO 
    18812027 
    1882 # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely 
     2028# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely 
    18832029# formatted so it can be parsed by a human reader. This is useful if you want to 
    1884 # understand what is going on. On the other hand, if this tag is set to NO the 
     2030# understand what is going on. On the other hand, if this tag is set to NO, the 
    18852031# size of the Perl module output will be much smaller and Perl will parse it 
    18862032# just the same. 
     
    19022048#--------------------------------------------------------------------------- 
    19032049 
    1904 # If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all 
     2050# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all 
    19052051# C-preprocessor directives found in the sources and include files. 
    19062052# The default value is: YES. 
     
    19082054ENABLE_PREPROCESSING   = YES 
    19092055 
    1910 # If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names 
    1911 # in the source code. If set to NO only conditional compilation will be 
     2056# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names 
     2057# in the source code. If set to NO, only conditional compilation will be 
    19122058# performed. Macro expansion can be done in a controlled way by setting 
    19132059# EXPAND_ONLY_PREDEF to YES. 
     
    19252071EXPAND_ONLY_PREDEF     = NO 
    19262072 
    1927 # If the SEARCH_INCLUDES tag is set to YES the includes files in the 
     2073# If the SEARCH_INCLUDES tag is set to YES, the include files in the 
    19282074# INCLUDE_PATH will be searched if a #include is found. 
    19292075# The default value is: YES. 
     
    20012147GENERATE_TAGFILE       = 
    20022148 
    2003 # If the ALLEXTERNALS tag is set to YES all external class will be listed in the 
    2004 # class index. If set to NO only the inherited external classes will be listed. 
     2149# If the ALLEXTERNALS tag is set to YES, all external class will be listed in 
     2150# the class index. If set to NO, only the inherited external classes will be 
     2151# listed. 
    20052152# The default value is: NO. 
    20062153 
    20072154ALLEXTERNALS           = NO 
    20082155 
    2009 # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in 
    2010 # the modules index. If set to NO, only the current project's groups will be 
     2156# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed 
     2157# in the modules index. If set to NO, only the current project's groups will be 
    20112158# listed. 
    20122159# The default value is: YES. 
     
    20142161EXTERNAL_GROUPS        = YES 
    20152162 
    2016 # If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in 
     2163# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in 
    20172164# the related pages index. If set to NO, only the current project's pages will 
    20182165# be listed. 
     
    20312178#--------------------------------------------------------------------------- 
    20322179 
    2033 # If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram 
     2180# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram 
    20342181# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to 
    20352182# NO turns the diagrams off. Note that this option also works with HAVE_DOT 
     
    20562203DIA_PATH               = 
    20572204 
    2058 # If set to YES, the inheritance and collaboration graphs will hide inheritance 
     2205# If set to YES the inheritance and collaboration graphs will hide inheritance 
    20592206# and usage relations if the target is undocumented or is not a class. 
    20602207# The default value is: YES. 
     
    21292276GROUP_GRAPHS           = YES 
    21302277 
    2131 # If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
     2278# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and 
    21322279# collaboration diagrams in a style similar to the OMG's Unified Modeling 
    21332280# Language. 
     
    21812328# Note that enabling this option will significantly increase the time of a run. 
    21822329# So in most cases it will be better to enable call graphs for selected 
    2183 # functions only using the \callgraph command. 
     2330# functions only using the \callgraph command. Disabling a call graph can be 
     2331# accomplished by means of the command \hidecallgraph. 
    21842332# The default value is: NO. 
    21852333# This tag requires that the tag HAVE_DOT is set to YES. 
     
    21922340# Note that enabling this option will significantly increase the time of a run. 
    21932341# So in most cases it will be better to enable caller graphs for selected 
    2194 # functions only using the \callergraph command. 
     2342# functions only using the \callergraph command. Disabling a caller graph can be 
     2343# accomplished by means of the command \hidecallergraph. 
    21952344# The default value is: NO. 
    21962345# This tag requires that the tag HAVE_DOT is set to YES. 
     
    22152364 
    22162365# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
    2217 # generated by dot. 
     2366# generated by dot. For an explanation of the image formats see the section 
     2367# output formats in the documentation of the dot tool (Graphviz (see: 
     2368# http://www.graphviz.org/)). 
    22182369# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order 
    22192370# to make the SVG files visible in IE 9+ (other browsers do not have this 
    22202371# requirement). 
    2221 # Possible values are: png, jpg, gif and svg. 
     2372# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, 
     2373# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and 
     2374# png:gdiplus:gdiplus. 
    22222375# The default value is: png. 
    22232376# This tag requires that the tag HAVE_DOT is set to YES. 
     
    22672420# generate a warning when it encounters a \startuml command in this case and 
    22682421# will not generate output for the diagram. 
    2269 # This tag requires that the tag HAVE_DOT is set to YES. 
    22702422 
    22712423PLANTUML_JAR_PATH      = 
     2424 
     2425# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a 
     2426# configuration file for plantuml. 
     2427 
     2428PLANTUML_CFG_FILE      = 
     2429 
     2430# When using plantuml, the specified paths are searched for files specified by 
     2431# the !include statement in a plantuml block. 
     2432 
     2433PLANTUML_INCLUDE_PATH  = 
    22722434 
    22732435# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes 
     
    23072469DOT_TRANSPARENT        = NO 
    23082470 
    2309 # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
     2471# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output 
    23102472# files in one run (i.e. multiple -o and -T options on the command line). This 
    23112473# makes dot run faster, but since only newer versions of dot (>1.8.10) support 
     
    23242486GENERATE_LEGEND        = YES 
    23252487 
    2326 # If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot 
     2488# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot 
    23272489# files that are used to generate the various graphs. 
    23282490# The default value is: YES. 
  • utils/tools/SIREN/README

    r7646 r12080  
    11 
    2 To create SIREN documentation, run doxygen in TOOLS/SIREN directory  
    3 (http://www.stack.nl/~dimitri/doxygen/index.html version 1.8.3.1 or upper) 
     2To create SIREN documentation, run doxygen in TOOLS/SIREN directory 
     3(http://www.stack.nl/~dimitri/doxygen/index.html version 1.8.5 or upper) 
    44then 
    55   open ./TOOLS/SIREN/doc/html/index.html in your web browser 
  • utils/tools/SIREN/cfg/dimension.cfg

    r7646 r12080  
    11&namdim 
     2   in_dimX=2 
     3   in_dimY=2 
     4   in_dimZ=6 
     5   in_dimT=3 
    26   cn_dimX="x","xaxis" 
    37   cn_dimY="y","yaxis" 
  • utils/tools/SIREN/cfg/dummy.cfg

    r7646 r12080  
    11&namdum 
     2   in_ndumvar=4 
     3   in_ndumdim=0 
     4   in_ndumatt=1 
    25   cn_dumvar="orca_lon", "orca_lat", "time_instant", "time_centered" 
    36   cn_dumdim="" 
  • utils/tools/SIREN/src/attribute.f90

    r9598 r12080  
    22! NEMO system team, System and Interface for oceanic RElocable Nesting 
    33!---------------------------------------------------------------------- 
    4 ! 
    5 ! MODULE: att 
    64! 
    75! DESCRIPTION: 
     
    7977!> 
    8078!> @author J.Paul 
    81 ! REVISION HISTORY: 
     79!> 
    8280!> @date November, 2013 - Initial Version 
    8381!> @date November, 2014  
     
    8583!> @date September, 2015 
    8684!> - manage useless (dummy) attributes 
    87 ! 
    88 !> @note Software governed by the CeCILL licence     (./LICENSE) 
     85!> @date May, 2019 
     86!> - read number of element for each dummy array in configuration file 
     87!> 
     88!> @note Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    8989!---------------------------------------------------------------------- 
    9090MODULE att 
     91 
    9192   USE netcdf                          ! nf90 library 
    9293   USE global                          ! global variable 
     
    9495   USE logger                          ! log file manager 
    9596   USE fct                             ! basic useful function 
     97 
    9698   IMPLICIT NONE 
     99 
    97100   ! NOTE_avoid_public_variables_if_possible 
    98101 
     
    100103   PUBLIC :: TATT       !< attribute structure 
    101104 
    102    PRIVATE :: cm_dumatt !< dummy attribute array 
     105   PRIVATE :: im_ndumatt   !< number of elt in dummy attribute array 
     106   PRIVATE :: cm_dumatt    !< dummy attribute array 
    103107 
    104108   ! function and subroutine 
     
    141145   END TYPE TATT 
    142146 
    143    CHARACTER(LEN=lc), DIMENSION(ip_maxdumcfg), SAVE :: cm_dumatt !< dummy attribute 
     147   INTEGER(i4)                               , SAVE :: im_ndumatt !< number of elt in dummy attribute array 
     148   CHARACTER(LEN=lc), DIMENSION(ip_maxdumcfg), SAVE :: cm_dumatt  !< dummy attribute 
    144149 
    145150   INTERFACE att_init 
     
    175180 
    176181CONTAINS 
     182   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     183   FUNCTION att__copy_arr(td_att) & 
     184         & RESULT(tf_att)       
    177185   !------------------------------------------------------------------- 
    178186   !> @brief 
     
    196204   !> @return copy of input array of attribute structure 
    197205   !------------------------------------------------------------------- 
    198    FUNCTION att__copy_arr( td_att ) 
    199       IMPLICIT NONE 
    200       ! Argument 
    201       TYPE(TATT), DIMENSION(:), INTENT(IN) :: td_att 
    202       ! function 
    203       TYPE(TATT), DIMENSION(SIZE(td_att(:))) :: att__copy_arr 
     206 
     207      IMPLICIT NONE 
     208 
     209      ! Argument 
     210      TYPE(TATT), DIMENSION(:)  , INTENT(IN) :: td_att 
     211      ! function 
     212      TYPE(TATT), DIMENSION(SIZE(td_att(:))) :: tf_att 
    204213 
    205214      ! local variable 
     
    209218 
    210219      DO ji=1,SIZE(td_att(:)) 
    211          att__copy_arr(ji)=att_copy(td_att(ji)) 
     220         tf_att(ji)=att_copy(td_att(ji)) 
    212221      ENDDO 
    213222 
    214223   END FUNCTION att__copy_arr 
     224   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     225   FUNCTION att__copy_unit(td_att) & 
     226         & RESULT (tf_att) 
    215227   !------------------------------------------------------------------- 
    216228   !> @brief 
     
    235247   !> @return copy of input attribute structure 
    236248   !------------------------------------------------------------------- 
    237    FUNCTION att__copy_unit( td_att ) 
    238       IMPLICIT NONE 
     249 
     250      IMPLICIT NONE 
     251 
    239252      ! Argument 
    240253      TYPE(TATT), INTENT(IN)  :: td_att 
    241       ! function 
    242       TYPE(TATT) :: att__copy_unit 
     254 
     255      ! function 
     256      TYPE(TATT)              :: tf_att 
    243257 
    244258      ! local variable 
     
    247261 
    248262      ! copy attribute variable 
    249       att__copy_unit%c_name  = TRIM(td_att%c_name) 
    250       att__copy_unit%i_id    = td_att%i_id 
    251       att__copy_unit%i_type  = td_att%i_type 
    252       att__copy_unit%i_len   = td_att%i_len 
    253       att__copy_unit%c_value = TRIM(td_att%c_value) 
     263      tf_att%c_name  = TRIM(td_att%c_name) 
     264      tf_att%i_id    = td_att%i_id 
     265      tf_att%i_type  = td_att%i_type 
     266      tf_att%i_len   = td_att%i_len 
     267      tf_att%c_value = TRIM(td_att%c_value) 
    254268 
    255269      ! copy attribute pointer in an independant variable 
    256       IF( ASSOCIATED(att__copy_unit%d_value) ) DEALLOCATE(att__copy_unit%d_value) 
     270      IF( ASSOCIATED(tf_att%d_value) ) DEALLOCATE(tf_att%d_value) 
    257271      IF( ASSOCIATED(td_att%d_value) )THEN 
    258272         ALLOCATE( dl_value(td_att%i_len) ) 
    259273         dl_value(:) = td_att%d_value(:) 
    260274 
    261          ALLOCATE( att__copy_unit%d_value(att__copy_unit%i_len) ) 
    262          att__copy_unit%d_value(:) = dl_value(:) 
     275         ALLOCATE( tf_att%d_value(tf_att%i_len) ) 
     276         tf_att%d_value(:) = dl_value(:) 
    263277 
    264278         DEALLOCATE( dl_value ) 
     
    266280 
    267281   END FUNCTION att__copy_unit 
     282   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     283   FUNCTION att_get_index(td_att, cd_name) & 
     284         & RESULT(if_idx) 
    268285   !------------------------------------------------------------------- 
    269286   !> @brief This function return attribute index, in a array of attribute structure, 
     
    279296   !> @return attribute index 
    280297   !------------------------------------------------------------------- 
    281    INTEGER(i4) FUNCTION att_get_index( td_att, cd_name ) 
    282       IMPLICIT NONE 
     298 
     299      IMPLICIT NONE 
     300 
    283301      ! Argument 
    284302      TYPE(TATT),       DIMENSION(:), INTENT(IN) :: td_att 
    285303      CHARACTER(LEN=*),               INTENT(IN) :: cd_name 
    286304 
     305      ! function 
     306      INTEGER(i4)                                :: if_idx 
     307 
    287308      ! local variable 
    288309      INTEGER(i4) :: il_size 
     
    291312      INTEGER(i4) :: ji 
    292313      !---------------------------------------------------------------- 
    293       att_get_index=0 
     314      if_idx=0 
    294315 
    295316      il_size=SIZE(td_att(:)) 
    296317      DO ji=1,il_size 
    297318         IF( TRIM(td_att(ji)%c_name) == TRIM(cd_name) )THEN 
    298             att_get_index=ji 
     319            if_idx=ji 
    299320            EXIT 
    300321         ENDIF 
     
    302323 
    303324   END FUNCTION att_get_index 
     325   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     326   FUNCTION att_get_id(td_att, cd_name) & 
     327         & RESULT (if_id) 
    304328   !------------------------------------------------------------------- 
    305329   !> @brief This function return attribute id, read from a file.<br/> 
     
    316340   !> @return attribute id 
    317341   !------------------------------------------------------------------- 
    318    INTEGER(i4) FUNCTION att_get_id( td_att, cd_name ) 
    319       IMPLICIT NONE 
     342 
     343      IMPLICIT NONE 
     344 
    320345      ! Argument 
    321346      TYPE(TATT),       DIMENSION(:), INTENT(IN) :: td_att 
    322347      CHARACTER(LEN=*),               INTENT(IN) :: cd_name 
    323348 
     349      ! function 
     350      INTEGER(i4)                                :: if_id 
     351 
    324352      ! local variable 
    325353      INTEGER(i4) :: il_size 
     
    328356      INTEGER(i4) :: ji 
    329357      !---------------------------------------------------------------- 
    330       att_get_id=0 
     358      if_id=0 
    331359 
    332360      il_size=SIZE(td_att(:)) 
    333361      DO ji=1,il_size 
    334362         IF( TRIM(td_att(ji)%c_name) == TRIM(cd_name) )THEN 
    335             att_get_id=td_att(ji)%i_id 
     363            if_id=td_att(ji)%i_id 
    336364            EXIT 
    337365         ENDIF 
     
    339367 
    340368   END FUNCTION att_get_id 
     369   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     370   FUNCTION att__init_c(cd_name, cd_value) & 
     371         & RESULT (tf_att) 
    341372   !------------------------------------------------------------------- 
    342373   !> @brief This function initialize an attribute structure with character 
     
    350381   !> @return attribute structure 
    351382   !------------------------------------------------------------------- 
    352    TYPE(TATT) FUNCTION att__init_c( cd_name, cd_value ) 
    353       IMPLICIT NONE 
     383 
     384      IMPLICIT NONE 
     385 
    354386      ! Argument 
    355387      CHARACTER(LEN=*), INTENT(IN) :: cd_name 
    356388      CHARACTER(LEN=*), INTENT(IN) :: cd_value 
     389 
     390      ! function 
     391      TYPE(TATT)                   :: tf_att 
    357392      !---------------------------------------------------------------- 
    358393  
    359394      ! clean attribute 
    360       CALL att_clean(att__init_c) 
     395      CALL att_clean(tf_att) 
    361396 
    362397      CALL logger_trace( & 
     
    364399      &  " attribute value "//TRIM(ADJUSTL(cd_value)) ) 
    365400 
    366       att__init_c%c_name=TRIM(ADJUSTL(cd_name)) 
    367       att__init_c%i_type=NF90_CHAR 
    368  
    369       att__init_c%c_value=TRIM(ADJUSTL(cd_value)) 
    370       att__init_c%i_len=LEN( TRIM(ADJUSTL(cd_value)) ) 
     401      tf_att%c_name=TRIM(ADJUSTL(cd_name)) 
     402      tf_att%i_type=NF90_CHAR 
     403 
     404      tf_att%c_value=TRIM(ADJUSTL(cd_value)) 
     405      tf_att%i_len=LEN( TRIM(ADJUSTL(cd_value)) ) 
    371406 
    372407   END FUNCTION att__init_c 
     408   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     409   FUNCTION att__init_dp(cd_name, dd_value, id_type) & 
     410         & RESULT (tf_att) 
    373411   !------------------------------------------------------------------- 
    374412   !> @brief This function initialize an attribute structure with array  
     
    385423   !> @return attribute structure 
    386424   !------------------------------------------------------------------- 
    387    TYPE(TATT) FUNCTION att__init_dp( cd_name, dd_value, id_type ) 
     425 
    388426      IMPLICIT NONE 
    389427 
     
    393431      INTEGER(i4)                   , INTENT(IN), OPTIONAL :: id_type 
    394432 
     433      ! function 
     434      TYPE(TATT)                                 :: tf_att 
     435 
    395436      ! local value 
    396437      INTEGER(i4)       :: il_len 
     
    402443 
    403444      ! clean attribute 
    404       CALL att_clean(att__init_dp) 
     445      CALL att_clean(tf_att) 
    405446 
    406447      ! array size 
     
    417458      &  " attribute value "//TRIM(ADJUSTL(cl_value)) ) 
    418459 
    419       att__init_dp%c_name=TRIM(ADJUSTL(cd_name)) 
     460      tf_att%c_name=TRIM(ADJUSTL(cd_name)) 
    420461 
    421462      IF( PRESENT(id_type) )THEN 
    422          att__init_dp%i_type=id_type 
     463         tf_att%i_type=id_type 
    423464      ELSE 
    424          att__init_dp%i_type=NF90_DOUBLE 
    425       ENDIF 
    426  
    427       IF( ASSOCIATED(att__init_dp%d_value) )THEN 
    428          DEALLOCATE(att__init_dp%d_value) 
    429       ENDIF 
    430       ALLOCATE(att__init_dp%d_value(il_len)) 
    431  
    432       att__init_dp%d_value(:)=dd_value(:) 
    433       att__init_dp%i_len=il_len 
     465         tf_att%i_type=NF90_DOUBLE 
     466      ENDIF 
     467 
     468      IF( ASSOCIATED(tf_att%d_value) )THEN 
     469         DEALLOCATE(tf_att%d_value) 
     470      ENDIF 
     471      ALLOCATE(tf_att%d_value(il_len)) 
     472 
     473      tf_att%d_value(:)=dd_value(:) 
     474      tf_att%i_len=il_len 
    434475 
    435476   END FUNCTION att__init_dp 
     477   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     478   FUNCTION att__init_dp_0d(cd_name, dd_value, id_type) & 
     479         & RESULT (tf_att) 
    436480   !------------------------------------------------------------------- 
    437481   !> @brief This function initialize an attribute structure with  
     
    448492   !> @return attribute structure 
    449493   !------------------------------------------------------------------- 
    450    TYPE(TATT) FUNCTION att__init_dp_0d( cd_name, dd_value, id_type ) 
    451       IMPLICIT NONE 
     494 
     495      IMPLICIT NONE 
     496 
    452497      ! Argument 
    453498      CHARACTER(LEN=*), INTENT(IN) :: cd_name 
     
    455500      INTEGER(i4)     , INTENT(IN), OPTIONAL :: id_type 
    456501 
     502      ! function 
     503      TYPE(TATT)                   :: tf_att 
     504 
    457505      ! local value 
    458506      CHARACTER(LEN=lc) :: cl_value 
     
    460508 
    461509      ! clean attribute 
    462       CALL att_clean(att__init_dp_0d) 
     510      CALL att_clean(tf_att) 
    463511       
    464512      cl_value="(/"//TRIM(fct_str(dd_value))//"/)" 
     
    468516      &  " attribute value "//TRIM(ADJUSTL(cl_value)) ) 
    469517 
    470       att__init_dp_0d%c_name=TRIM(ADJUSTL(cd_name)) 
     518      tf_att%c_name=TRIM(ADJUSTL(cd_name)) 
    471519 
    472520      IF( PRESENT(id_type) )THEN 
    473          att__init_dp_0d%i_type=id_type 
     521         tf_att%i_type=id_type 
    474522      ELSE 
    475          att__init_dp_0d%i_type=NF90_DOUBLE 
    476       ENDIF 
    477  
    478       IF( ASSOCIATED(att__init_dp_0d%d_value) )THEN 
    479          DEALLOCATE(att__init_dp_0d%d_value) 
    480       ENDIF 
    481       ALLOCATE(att__init_dp_0d%d_value(1)) 
    482  
    483       att__init_dp_0d%d_value(1)=dd_value 
    484       att__init_dp_0d%i_len=1 
     523         tf_att%i_type=NF90_DOUBLE 
     524      ENDIF 
     525 
     526      IF( ASSOCIATED(tf_att%d_value) )THEN 
     527         DEALLOCATE(tf_att%d_value) 
     528      ENDIF 
     529      ALLOCATE(tf_att%d_value(1)) 
     530 
     531      tf_att%d_value(1)=dd_value 
     532      tf_att%i_len=1 
    485533 
    486534   END FUNCTION att__init_dp_0d 
     535   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     536   FUNCTION att__init_sp(cd_name, rd_value, id_type) & 
     537         & RESULT (tf_att) 
    487538   !------------------------------------------------------------------- 
    488539   !> @brief This function initialize an attribute structure with array  
     
    499550   !> @return attribute structure 
    500551   !------------------------------------------------------------------- 
    501    TYPE(TATT) FUNCTION att__init_sp( cd_name, rd_value, id_type ) 
    502       IMPLICIT NONE 
     552 
     553      IMPLICIT NONE 
     554 
    503555      ! Argument 
    504556      CHARACTER(LEN=*),               INTENT(IN) :: cd_name 
     
    506558      INTEGER(i4)                   , INTENT(IN), OPTIONAL :: id_type 
    507559 
     560      ! function 
     561      TYPE(TATT)                                 :: tf_att 
     562 
    508563      ! local value 
    509564      INTEGER(i4)       :: il_len 
     
    515570 
    516571      ! clean attribute 
    517       CALL att_clean(att__init_sp) 
     572      CALL att_clean(tf_att) 
    518573       
    519574      ! array size 
     
    524579         cl_value=TRIM(cl_value)//TRIM(fct_str(rd_value(ji)))//"," 
    525580      ENDDO 
     581      CALL logger_trace( & 
     582      &  " ATT INIT: attribute name: il_len "//fct_str(il_len)& 
     583      ) 
    526584      cl_value=TRIM(cl_value)//TRIM(fct_str(rd_value(il_len)))//"/)" 
    527585 
     
    530588      &  " attribute value "//TRIM(ADJUSTL(cl_value)) )       
    531589 
    532       att__init_sp%c_name=TRIM(ADJUSTL(cd_name)) 
     590      tf_att%c_name=TRIM(ADJUSTL(cd_name)) 
    533591 
    534592      IF( PRESENT(id_type) )THEN 
    535          att__init_sp%i_type=id_type 
     593         tf_att%i_type=id_type 
    536594      ELSE 
    537          att__init_sp%i_type=NF90_FLOAT 
    538       ENDIF 
    539  
    540       IF( ASSOCIATED(att__init_sp%d_value) )THEN 
    541          DEALLOCATE(att__init_sp%d_value) 
    542       ENDIF 
    543       ALLOCATE(att__init_sp%d_value(il_len)) 
    544  
    545       att__init_sp%d_value(:)=REAL(rd_value(:),dp) 
    546       att__init_sp%i_len=il_len 
     595         tf_att%i_type=NF90_FLOAT 
     596      ENDIF 
     597 
     598      IF( ASSOCIATED(tf_att%d_value) )THEN 
     599         DEALLOCATE(tf_att%d_value) 
     600      ENDIF 
     601      ALLOCATE(tf_att%d_value(il_len)) 
     602 
     603      tf_att%d_value(:)=REAL(rd_value(:),dp) 
     604      tf_att%i_len=il_len 
    547605 
    548606   END FUNCTION att__init_sp 
     607   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     608   FUNCTION att__init_sp_0d(cd_name, rd_value, id_type) & 
     609         & RESULT (tf_att) 
    549610   !------------------------------------------------------------------- 
    550611   !> @brief This function initialize an attribute structure with  
     
    561622   !> @return attribute structure 
    562623   !------------------------------------------------------------------- 
    563    TYPE(TATT) FUNCTION att__init_sp_0d( cd_name, rd_value, id_type ) 
    564       IMPLICIT NONE 
     624 
     625      IMPLICIT NONE 
     626 
    565627      ! Argument 
    566628      CHARACTER(LEN=*), INTENT(IN) :: cd_name 
     
    568630      INTEGER(i4)     , INTENT(IN), OPTIONAL :: id_type 
    569631 
     632      ! function 
     633      TYPE(TATT)                   :: tf_att 
     634 
    570635      ! local value 
    571636      CHARACTER(LEN=lc) :: cl_value 
     
    573638 
    574639      ! clean attribute 
    575       CALL att_clean(att__init_sp_0d) 
     640      CALL att_clean(tf_att) 
    576641       
    577642      cl_value="(/"//TRIM(fct_str(rd_value))//"/)" 
     
    581646      &  " attribute value "//TRIM(ADJUSTL(cl_value)) )       
    582647 
    583       att__init_sp_0d%c_name=TRIM(ADJUSTL(cd_name)) 
     648      tf_att%c_name=TRIM(ADJUSTL(cd_name)) 
    584649 
    585650      IF( PRESENT(id_type) )THEN 
    586          att__init_sp_0d%i_type=id_type 
     651         tf_att%i_type=id_type 
    587652      ELSE 
    588          att__init_sp_0d%i_type=NF90_FLOAT 
    589       ENDIF 
    590  
    591       IF( ASSOCIATED(att__init_sp_0d%d_value) )THEN 
    592          DEALLOCATE(att__init_sp_0d%d_value) 
    593       ENDIF 
    594       ALLOCATE(att__init_sp_0d%d_value(1)) 
    595  
    596       att__init_sp_0d%d_value(1)=REAL(rd_value,dp) 
    597       att__init_sp_0d%i_len=1 
     653         tf_att%i_type=NF90_FLOAT 
     654      ENDIF 
     655 
     656      IF( ASSOCIATED(tf_att%d_value) )THEN 
     657         DEALLOCATE(tf_att%d_value) 
     658      ENDIF 
     659      ALLOCATE(tf_att%d_value(1)) 
     660 
     661      tf_att%d_value(1)=REAL(rd_value,dp) 
     662      tf_att%i_len=1 
    598663 
    599664   END FUNCTION att__init_sp_0d 
     665   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     666   FUNCTION att__init_i1(cd_name, bd_value, id_type) & 
     667         & RESULT (tf_att) 
    600668   !------------------------------------------------------------------- 
    601669   !> @brief This function initialize an attribute structure with array  
     
    612680   !> @return attribute structure 
    613681   !------------------------------------------------------------------- 
    614    TYPE(TATT) FUNCTION att__init_i1( cd_name, bd_value, id_type ) 
    615       IMPLICIT NONE 
     682 
     683      IMPLICIT NONE 
     684 
    616685      ! Argument 
    617686      CHARACTER(LEN=*),               INTENT(IN) :: cd_name 
     
    619688      INTEGER(i4)                   , INTENT(IN), OPTIONAL :: id_type 
    620689 
     690      ! function 
     691      TYPE(TATT)                                 :: tf_att 
     692 
    621693      ! local value 
    622694      INTEGER(i4)       :: il_len 
     
    628700 
    629701      ! clean attribute 
    630       CALL att_clean(att__init_i1) 
     702      CALL att_clean(tf_att) 
    631703       
    632704      ! array size 
     
    643715      &  " attribute value "//TRIM(ADJUSTL(cl_value)) )       
    644716 
    645       att__init_i1%c_name=TRIM(ADJUSTL(cd_name)) 
     717      tf_att%c_name=TRIM(ADJUSTL(cd_name)) 
    646718 
    647719      IF( PRESENT(id_type) )THEN 
    648          att__init_i1%i_type=id_type 
     720         tf_att%i_type=id_type 
    649721      ELSE 
    650          att__init_i1%i_type=NF90_BYTE 
    651       ENDIF 
    652  
    653       IF( ASSOCIATED(att__init_i1%d_value) )THEN 
    654          DEALLOCATE(att__init_i1%d_value) 
    655       ENDIF 
    656       ALLOCATE(att__init_i1%d_value(il_len)) 
    657  
    658       att__init_i1%d_value(:)=REAL(bd_value(:),dp) 
    659       att__init_i1%i_len=il_len 
     722         tf_att%i_type=NF90_BYTE 
     723      ENDIF 
     724 
     725      IF( ASSOCIATED(tf_att%d_value) )THEN 
     726         DEALLOCATE(tf_att%d_value) 
     727      ENDIF 
     728      ALLOCATE(tf_att%d_value(il_len)) 
     729 
     730      tf_att%d_value(:)=REAL(bd_value(:),dp) 
     731      tf_att%i_len=il_len 
    660732 
    661733   END FUNCTION att__init_i1 
     734   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     735   FUNCTION att__init_i1_0d(cd_name, bd_value, id_type) & 
     736         & RESULT (tf_att) 
    662737   !------------------------------------------------------------------- 
    663738   !> @brief This function initialize an attribute structure with  
     
    674749   !> @return attribute structure 
    675750   !------------------------------------------------------------------- 
    676    TYPE(TATT) FUNCTION att__init_i1_0d( cd_name, bd_value, id_type ) 
    677       IMPLICIT NONE 
     751 
     752      IMPLICIT NONE 
     753 
    678754      ! Argument 
    679755      CHARACTER(LEN=*), INTENT(IN) :: cd_name 
     
    681757      INTEGER(i4)     , INTENT(IN), OPTIONAL :: id_type 
    682758 
     759      ! function 
     760      TYPE(TATT)                   :: tf_att 
     761 
    683762      !local value 
    684763      CHARACTER(LEN=lc) :: cl_value 
     
    686765 
    687766      ! clean attribute 
    688       CALL att_clean(att__init_i1_0d) 
     767      CALL att_clean(tf_att) 
    689768       
    690769      cl_value="(/"//TRIM(fct_str(bd_value))//"/)" 
     
    694773      &  " attibute value "//TRIM(ADJUSTL(cl_value)) )       
    695774 
    696       att__init_i1_0d%c_name=TRIM(ADJUSTL(cd_name)) 
     775      tf_att%c_name=TRIM(ADJUSTL(cd_name)) 
    697776 
    698777      IF( PRESENT(id_type) )THEN 
    699          att__init_i1_0d%i_type=id_type 
     778         tf_att%i_type=id_type 
    700779      ELSE 
    701          att__init_i1_0d%i_type=NF90_BYTE 
     780         tf_att%i_type=NF90_BYTE 
    702781      ENDIF       
    703782 
    704       IF( ASSOCIATED(att__init_i1_0d%d_value) )THEN 
    705          DEALLOCATE(att__init_i1_0d%d_value) 
    706       ENDIF 
    707       ALLOCATE(att__init_i1_0d%d_value(1)) 
    708  
    709       att__init_i1_0d%d_value(1)=REAL(bd_value,dp) 
    710       att__init_i1_0d%i_len=1 
     783      IF( ASSOCIATED(tf_att%d_value) )THEN 
     784         DEALLOCATE(tf_att%d_value) 
     785      ENDIF 
     786      ALLOCATE(tf_att%d_value(1)) 
     787 
     788      tf_att%d_value(1)=REAL(bd_value,dp) 
     789      tf_att%i_len=1 
    711790 
    712791   END FUNCTION att__init_i1_0d 
     792   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     793   FUNCTION att__init_i2(cd_name, sd_value, id_type) & 
     794         & RESULT (tf_att) 
    713795   !------------------------------------------------------------------- 
    714796   !> @brief This function initialize an attribute structure with array  
     
    725807   !> @return attribute structure 
    726808   !------------------------------------------------------------------- 
    727    TYPE(TATT) FUNCTION att__init_i2( cd_name, sd_value, id_type ) 
    728       IMPLICIT NONE 
     809 
     810      IMPLICIT NONE 
     811 
    729812      ! Argument 
    730813      CHARACTER(LEN=*),               INTENT(IN) :: cd_name 
     
    732815      INTEGER(i4)                   , INTENT(IN), OPTIONAL :: id_type 
    733816 
     817      ! function 
     818      TYPE(TATT)                                 :: tf_att 
     819 
    734820      ! local value 
    735821      INTEGER(i4)       :: il_len 
     
    741827 
    742828      ! clean attribute 
    743       CALL att_clean(att__init_i2) 
     829      CALL att_clean(tf_att) 
    744830       
    745831      ! array size 
     
    756842      &  " attribute value "//TRIM(ADJUSTL(cl_value)) )       
    757843 
    758       att__init_i2%c_name=TRIM(ADJUSTL(cd_name)) 
     844      tf_att%c_name=TRIM(ADJUSTL(cd_name)) 
    759845 
    760846      IF( PRESENT(id_type) )THEN 
    761          att__init_i2%i_type=id_type 
     847         tf_att%i_type=id_type 
    762848      ELSE 
    763          att__init_i2%i_type=NF90_SHORT 
    764       ENDIF 
    765  
    766       IF( ASSOCIATED(att__init_i2%d_value) )THEN 
    767          DEALLOCATE(att__init_i2%d_value) 
    768       ENDIF 
    769       ALLOCATE(att__init_i2%d_value(il_len)) 
    770  
    771       att__init_i2%d_value(:)=REAL(sd_value(:),dp) 
    772       att__init_i2%i_len=il_len 
     849         tf_att%i_type=NF90_SHORT 
     850      ENDIF 
     851 
     852      IF( ASSOCIATED(tf_att%d_value) )THEN 
     853         DEALLOCATE(tf_att%d_value) 
     854      ENDIF 
     855      ALLOCATE(tf_att%d_value(il_len)) 
     856 
     857      tf_att%d_value(:)=REAL(sd_value(:),dp) 
     858      tf_att%i_len=il_len 
    773859 
    774860   END FUNCTION att__init_i2 
     861   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     862   FUNCTION att__init_i2_0d(cd_name, sd_value, id_type) & 
     863         & RESULT (tf_att) 
    775864   !------------------------------------------------------------------- 
    776865   !> @brief This function initialize an attribute structure with  
     
    787876   !> @return attribute structure 
    788877   !------------------------------------------------------------------- 
    789    TYPE(TATT) FUNCTION att__init_i2_0d( cd_name, sd_value, id_type ) 
    790       IMPLICIT NONE 
     878 
     879      IMPLICIT NONE 
     880 
    791881      ! Argument 
    792882      CHARACTER(LEN=*), INTENT(IN) :: cd_name 
     
    794884      INTEGER(i4)     , INTENT(IN), OPTIONAL :: id_type 
    795885 
     886      ! function 
     887      TYPE(TATT)                   :: tf_att 
     888 
    796889      !local value 
    797890      CHARACTER(LEN=lc) :: cl_value 
     
    799892 
    800893      ! clean attribute 
    801       CALL att_clean(att__init_i2_0d) 
     894      CALL att_clean(tf_att) 
    802895       
    803896      cl_value="(/"//TRIM(fct_str(sd_value))//"/)" 
     
    807900      &  " attibute value "//TRIM(ADJUSTL(cl_value)) )       
    808901 
    809       att__init_i2_0d%c_name=TRIM(ADJUSTL(cd_name)) 
     902      tf_att%c_name=TRIM(ADJUSTL(cd_name)) 
    810903 
    811904      IF( PRESENT(id_type) )THEN 
    812          att__init_i2_0d%i_type=id_type 
     905         tf_att%i_type=id_type 
    813906      ELSE 
    814          att__init_i2_0d%i_type=NF90_SHORT 
    815       ENDIF 
    816  
    817       IF( ASSOCIATED(att__init_i2_0d%d_value) )THEN 
    818          DEALLOCATE(att__init_i2_0d%d_value) 
    819       ENDIF 
    820       ALLOCATE(att__init_i2_0d%d_value(1)) 
    821  
    822       att__init_i2_0d%d_value(1)=REAL(sd_value,dp) 
    823       att__init_i2_0d%i_len=1 
     907         tf_att%i_type=NF90_SHORT 
     908      ENDIF 
     909 
     910      IF( ASSOCIATED(tf_att%d_value) )THEN 
     911         DEALLOCATE(tf_att%d_value) 
     912      ENDIF 
     913      ALLOCATE(tf_att%d_value(1)) 
     914 
     915      tf_att%d_value(1)=REAL(sd_value,dp) 
     916      tf_att%i_len=1 
    824917 
    825918   END FUNCTION att__init_i2_0d 
     919   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     920   FUNCTION att__init_i4(cd_name, id_value, id_type) & 
     921         & RESULT(tf_att) 
    826922   !------------------------------------------------------------------- 
    827923   !> @brief This function initialize an attribute structure with array  
     
    838934   !> @return attribute structure 
    839935   !------------------------------------------------------------------- 
    840    TYPE(TATT) FUNCTION att__init_i4( cd_name, id_value, id_type ) 
    841       IMPLICIT NONE 
     936 
     937      IMPLICIT NONE 
     938 
    842939      ! Argument 
    843940      CHARACTER(LEN=*),               INTENT(IN) :: cd_name 
     
    845942      INTEGER(i4)                   , INTENT(IN), OPTIONAL :: id_type 
    846943 
     944      ! function 
     945      TYPE(TATT)                                 :: tf_att 
     946 
    847947      ! local value 
    848948      INTEGER(i4)       :: il_len 
     
    854954 
    855955      ! clean attribute 
    856       CALL att_clean(att__init_i4) 
     956      CALL att_clean(tf_att) 
    857957       
    858958      ! array size 
     
    869969      &  " attribute value "//TRIM(ADJUSTL(cl_value)) )       
    870970 
    871       att__init_i4%c_name=TRIM(ADJUSTL(cd_name)) 
     971      tf_att%c_name=TRIM(ADJUSTL(cd_name)) 
    872972 
    873973      IF( PRESENT(id_type) )THEN 
    874          att__init_i4%i_type=id_type 
     974         tf_att%i_type=id_type 
    875975      ELSE 
    876          att__init_i4%i_type=NF90_INT 
    877       ENDIF 
    878  
    879       IF( ASSOCIATED(att__init_i4%d_value) )THEN 
    880          DEALLOCATE(att__init_i4%d_value) 
    881       ENDIF 
    882       ALLOCATE(att__init_i4%d_value(il_len)) 
    883  
    884       att__init_i4%d_value(:)=REAL(id_value(:),dp) 
    885       att__init_i4%i_len=il_len 
     976         tf_att%i_type=NF90_INT 
     977      ENDIF 
     978 
     979      IF( ASSOCIATED(tf_att%d_value) )THEN 
     980         DEALLOCATE(tf_att%d_value) 
     981      ENDIF 
     982      ALLOCATE(tf_att%d_value(il_len)) 
     983 
     984      tf_att%d_value(:)=REAL(id_value(:),dp) 
     985      tf_att%i_len=il_len 
    886986 
    887987   END FUNCTION att__init_i4 
     988   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     989   FUNCTION att__init_i4_0d(cd_name, id_value, id_type) & 
     990         & RESULT (tf_att) 
    888991   !------------------------------------------------------------------- 
    889992   !> @brief This function initialize an attribute structure with  
     
    9001003   !> @return attribute structure 
    9011004   !------------------------------------------------------------------- 
    902    TYPE(TATT) FUNCTION att__init_i4_0d( cd_name, id_value, id_type ) 
    903       IMPLICIT NONE 
     1005 
     1006      IMPLICIT NONE 
     1007 
    9041008      ! Argument 
    9051009      CHARACTER(LEN=*), INTENT(IN) :: cd_name 
     
    9071011      INTEGER(i4)     , INTENT(IN), OPTIONAL :: id_type 
    9081012 
     1013      ! function 
     1014      TYPE(TATT)                   :: tf_att 
     1015 
    9091016      !local value 
    9101017      CHARACTER(LEN=lc) :: cl_value 
     
    9121019 
    9131020      ! clean attribute 
    914       CALL att_clean(att__init_i4_0d) 
     1021      CALL att_clean(tf_att) 
    9151022       
    9161023      cl_value="(/"//TRIM(fct_str(id_value))//"/)" 
     
    9201027      &  " attibute value "//TRIM(ADJUSTL(cl_value)) )       
    9211028 
    922       att__init_i4_0d%c_name=TRIM(ADJUSTL(cd_name)) 
     1029      tf_att%c_name=TRIM(ADJUSTL(cd_name)) 
    9231030 
    9241031      IF( PRESENT(id_type) )THEN 
    925          att__init_i4_0d%i_type=id_type 
     1032         tf_att%i_type=id_type 
    9261033      ELSE 
    927          att__init_i4_0d%i_type=NF90_INT 
    928       ENDIF 
    929  
    930       IF( ASSOCIATED(att__init_i4_0d%d_value) )THEN 
    931          DEALLOCATE(att__init_i4_0d%d_value) 
    932       ENDIF 
    933       ALLOCATE(att__init_i4_0d%d_value(1)) 
    934  
    935       att__init_i4_0d%d_value(1)=REAL(id_value,dp) 
    936       att__init_i4_0d%i_len=1 
     1034         tf_att%i_type=NF90_INT 
     1035      ENDIF 
     1036 
     1037      IF( ASSOCIATED(tf_att%d_value) )THEN 
     1038         DEALLOCATE(tf_att%d_value) 
     1039      ENDIF 
     1040      ALLOCATE(tf_att%d_value(1)) 
     1041 
     1042      tf_att%d_value(1)=REAL(id_value,dp) 
     1043      tf_att%i_len=1 
    9371044 
    9381045   END FUNCTION att__init_i4_0d 
     1046   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1047   FUNCTION att__init_i8(cd_name, kd_value, id_type) & 
     1048         & RESULT (tf_att) 
    9391049   !------------------------------------------------------------------- 
    9401050   !> @brief This function initialize an attribute structure with array  
     
    9511061   !> @return attribute structure 
    9521062   !------------------------------------------------------------------- 
    953    TYPE(TATT) FUNCTION att__init_i8( cd_name, kd_value, id_type ) 
    954       IMPLICIT NONE 
     1063 
     1064      IMPLICIT NONE 
     1065 
    9551066      ! Argument 
    9561067      CHARACTER(LEN=*),               INTENT(IN) :: cd_name 
     
    9581069      INTEGER(i4)                   , INTENT(IN), OPTIONAL :: id_type 
    9591070 
     1071      ! function 
     1072      TYPE(TATT)                                 :: tf_att 
     1073 
    9601074      ! local value 
    9611075      INTEGER(i4)       :: il_len 
     
    9671081 
    9681082      ! clean attribute 
    969       CALL att_clean(att__init_i8) 
     1083      CALL att_clean(tf_att) 
    9701084       
    9711085      ! array size 
     
    9821096      &  " attibute value "//TRIM(ADJUSTL(cl_value)) )       
    9831097 
    984       att__init_i8%c_name=TRIM(ADJUSTL(cd_name)) 
     1098      tf_att%c_name=TRIM(ADJUSTL(cd_name)) 
    9851099 
    9861100      IF( PRESENT(id_type) )THEN 
    987          att__init_i8%i_type=id_type 
     1101         tf_att%i_type=id_type 
    9881102      ELSE 
    989          att__init_i8%i_type=NF90_INT 
    990       ENDIF 
    991  
    992       IF( ASSOCIATED(att__init_i8%d_value) )THEN 
    993          DEALLOCATE(att__init_i8%d_value) 
    994       ENDIF 
    995       ALLOCATE(att__init_i8%d_value(il_len)) 
    996  
    997       att__init_i8%d_value(:)=REAL(kd_value(:),dp) 
    998       att__init_i8%i_len=il_len 
     1103         tf_att%i_type=NF90_INT 
     1104      ENDIF 
     1105 
     1106      IF( ASSOCIATED(tf_att%d_value) )THEN 
     1107         DEALLOCATE(tf_att%d_value) 
     1108      ENDIF 
     1109      ALLOCATE(tf_att%d_value(il_len)) 
     1110 
     1111      tf_att%d_value(:)=REAL(kd_value(:),dp) 
     1112      tf_att%i_len=il_len 
    9991113 
    10001114   END FUNCTION att__init_i8 
     1115   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1116   FUNCTION att__init_i8_0d(cd_name, kd_value, id_type) & 
     1117         & RESULT (tf_att) 
    10011118   !------------------------------------------------------------------- 
    10021119   !> @brief This function initialize an attribute structure with  
     
    10131130   !> @return attribute structure 
    10141131   !------------------------------------------------------------------- 
    1015    TYPE(TATT) FUNCTION att__init_i8_0d( cd_name, kd_value, id_type ) 
    1016       IMPLICIT NONE 
     1132 
     1133      IMPLICIT NONE 
     1134 
    10171135      ! Argument 
    10181136      CHARACTER(LEN=*), INTENT(IN) :: cd_name 
     
    10201138      INTEGER(i4)     , INTENT(IN), OPTIONAL :: id_type 
    10211139 
     1140      ! function 
     1141      TYPE(TATT)                   :: tf_att 
     1142 
    10221143      ! local value 
    10231144      CHARACTER(LEN=lc) :: cl_value 
     
    10251146 
    10261147      ! clean attribute 
    1027       CALL att_clean(att__init_i8_0d) 
     1148      CALL att_clean(tf_att) 
    10281149       
    10291150      cl_value="(/"//TRIM(fct_str(kd_value))//"/)" 
     
    10331154      &  " attibute value "//TRIM(ADJUSTL(cl_value)) )       
    10341155 
    1035       att__init_i8_0d%c_name=TRIM(ADJUSTL(cd_name)) 
     1156      tf_att%c_name=TRIM(ADJUSTL(cd_name)) 
    10361157 
    10371158      IF( PRESENT(id_type) )THEN 
    1038          att__init_i8_0d%i_type=id_type 
     1159         tf_att%i_type=id_type 
    10391160      ELSE 
    1040          att__init_i8_0d%i_type=NF90_INT 
    1041       ENDIF 
    1042  
    1043       IF( ASSOCIATED(att__init_i8_0d%d_value) )THEN 
    1044          DEALLOCATE(att__init_i8_0d%d_value) 
    1045       ENDIF 
    1046       ALLOCATE(att__init_i8_0d%d_value(1)) 
    1047  
    1048       att__init_i8_0d%d_value(1)=REAL(kd_value,dp) 
    1049       att__init_i8_0d%i_len=1 
     1161         tf_att%i_type=NF90_INT 
     1162      ENDIF 
     1163 
     1164      IF( ASSOCIATED(tf_att%d_value) )THEN 
     1165         DEALLOCATE(tf_att%d_value) 
     1166      ENDIF 
     1167      ALLOCATE(tf_att%d_value(1)) 
     1168 
     1169      tf_att%d_value(1)=REAL(kd_value,dp) 
     1170      tf_att%i_len=1 
    10501171 
    10511172   END FUNCTION att__init_i8_0d 
     1173   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1174   SUBROUTINE att__print_arr(td_att) 
    10521175   !------------------------------------------------------------------- 
    10531176   !> @brief This subroutine print informations of an array of attribute.  
     
    10581181   !> @param[in] td_att array of attribute structure 
    10591182   !------------------------------------------------------------------- 
    1060    SUBROUTINE att__print_arr(td_att) 
     1183 
    10611184      IMPLICIT NONE 
    10621185 
     
    10731196 
    10741197   END SUBROUTINE att__print_arr 
     1198   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1199   SUBROUTINE att__print_unit(td_att) 
    10751200   !------------------------------------------------------------------- 
    10761201   !> @brief This subroutine print attribute information. 
     
    10831208   !> @param[in] td_att attribute structure 
    10841209   !------------------------------------------------------------------- 
    1085    SUBROUTINE att__print_unit(td_att) 
     1210 
    10861211      IMPLICIT NONE 
    10871212 
     
    12051330 
    12061331   END SUBROUTINE att__print_unit 
     1332   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1333   SUBROUTINE att__clean_unit(td_att) 
    12071334   !------------------------------------------------------------------- 
    12081335   !> @brief  
     
    12111338   !> @author J.Paul 
    12121339   !> @date November, 2013 - Initial Version 
    1213    ! 
     1340   !> @date January, 2019  
     1341   !> - nullify array inside attribute structure 
     1342   !> 
    12141343   !> @param[inout] td_att attribute strcuture 
    12151344   !------------------------------------------------------------------- 
    1216    SUBROUTINE att__clean_unit( td_att ) 
    1217       IMPLICIT NONE 
     1345 
     1346      IMPLICIT NONE 
     1347 
    12181348      ! Argument 
    12191349      TYPE(TATT),  INTENT(INOUT) :: td_att 
     
    12291359         ! clean value 
    12301360         DEALLOCATE(td_att%d_value) 
     1361         NULLIFY(td_att%d_value) 
    12311362      ENDIF 
    12321363 
     
    12351366 
    12361367   END SUBROUTINE att__clean_unit 
     1368   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1369   SUBROUTINE att__clean_arr(td_att) 
    12371370   !------------------------------------------------------------------- 
    12381371   !> @brief  
     
    12441377   !> @param[inout] td_att attribute strcuture 
    12451378   !------------------------------------------------------------------- 
    1246    SUBROUTINE att__clean_arr( td_att ) 
    1247       IMPLICIT NONE 
     1379 
     1380      IMPLICIT NONE 
     1381 
    12481382      ! Argument 
    12491383      TYPE(TATT), DIMENSION(:), INTENT(INOUT) :: td_att 
     
    12591393 
    12601394   END SUBROUTINE att__clean_arr 
     1395   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1396   SUBROUTINE att_get_dummy(cd_dummy) 
    12611397   !------------------------------------------------------------------- 
    12621398   !> @brief This subroutine fill dummy attribute array 
     
    12661402   !> @date Marsh, 2016 
    12671403   !> - close file (bugfix) 
    1268    ! 
     1404   !> @date May, 2019 
     1405   !> - read number of dummy element  
     1406   !> 
    12691407   !> @param[in] cd_dummy dummy configuration file 
    12701408   !------------------------------------------------------------------- 
    1271    SUBROUTINE att_get_dummy( cd_dummy ) 
    1272       IMPLICIT NONE 
     1409 
     1410      IMPLICIT NONE 
     1411 
    12731412      ! Argument 
    12741413      CHARACTER(LEN=*), INTENT(IN) :: cd_dummy 
     
    12801419      LOGICAL       :: ll_exist 
    12811420 
    1282       ! loop indices 
    12831421      ! namelist 
     1422      INTEGER(i4)                                :: in_ndumvar 
     1423      INTEGER(i4)                                :: in_ndumdim 
     1424      INTEGER(i4)                                :: in_ndumatt 
    12841425      CHARACTER(LEN=lc), DIMENSION(ip_maxdumcfg) :: cn_dumvar 
    12851426      CHARACTER(LEN=lc), DIMENSION(ip_maxdumcfg) :: cn_dumdim 
    12861427      CHARACTER(LEN=lc), DIMENSION(ip_maxdumcfg) :: cn_dumatt 
    1287  
    12881428      !---------------------------------------------------------------- 
    12891429      NAMELIST /namdum/ &   !< dummy namelist 
     1430      &  in_ndumvar,&       !< number of dummy elt in variable array 
     1431      &  in_ndumdim,&       !< number of dummy elt in dimension array 
     1432      &  in_ndumatt,&       !< number of dummy elt in attribute array 
    12901433      &  cn_dumvar, &       !< variable  name 
    12911434      &  cn_dumdim, &       !< dimension name 
     
    13141457    
    13151458         READ( il_fileid, NML = namdum ) 
    1316          cm_dumatt(:)=cn_dumatt(:) 
     1459         im_ndumatt  = in_ndumatt 
     1460         cm_dumatt(:)= cn_dumatt(:) 
    13171461 
    13181462         CLOSE( il_fileid ) 
     1463 
     1464         IF( im_ndumatt > ip_maxdumcfg )THEN 
     1465            CALL logger_fatal("ATT GET dUMMY : too much dummy attributes & 
     1466            &     ( >"//fct_str(ip_maxdumcfg)//" ). & 
     1467            &     set ip_maxdumcfg to higher value.") 
     1468         ENDIF 
    13191469 
    13201470      ENDIF 
    13211471    
    13221472   END SUBROUTINE att_get_dummy 
     1473   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1474   FUNCTION att_is_dummy(td_att) & 
     1475         & RESULT (lf_dummy) 
    13231476   !------------------------------------------------------------------- 
    13241477   !> @brief This function check if attribute is defined as dummy attribute 
     
    13271480   !> @author J.Paul 
    13281481   !> @date September, 2015 - Initial Version 
    1329    ! 
     1482   !> @date, May, 2019 
     1483   !> - use number of dummy elt in do-loop 
     1484   !> 
    13301485   !> @param[in] td_att attribute structure 
    13311486   !> @return true if attribute is dummy attribute 
    13321487   !------------------------------------------------------------------- 
    1333    FUNCTION att_is_dummy(td_att) 
     1488 
    13341489      IMPLICIT NONE 
    13351490 
     
    13381493       
    13391494      ! function 
    1340       LOGICAL :: att_is_dummy 
     1495      LOGICAL                :: lf_dummy 
    13411496       
    13421497      ! loop indices 
     
    13441499      !---------------------------------------------------------------- 
    13451500 
    1346       att_is_dummy=.FALSE. 
    1347       DO ji=1,ip_maxdumcfg 
     1501      CALL logger_trace("ATT IS DUMMY : check if attribute is useless") 
     1502 
     1503      lf_dummy=.FALSE. 
     1504      DO ji=1,im_ndumatt 
    13481505         IF( fct_lower(td_att%c_name) == fct_lower(cm_dumatt(ji)) )THEN 
    1349             att_is_dummy=.TRUE. 
     1506            lf_dummy=.TRUE. 
    13501507            EXIT 
    13511508         ENDIF 
    13521509      ENDDO 
    13531510 
     1511      CALL logger_trace("ATT IS DUMMY : check ok") 
     1512 
    13541513   END FUNCTION att_is_dummy 
     1514   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    13551515END MODULE att 
    13561516 
  • utils/tools/SIREN/src/boundary.f90

    r9598 r12080  
    22! NEMO system team, System and Interface for oceanic RElocable Nesting 
    33!---------------------------------------------------------------------- 
    4 ! 
    5 ! MODULE: boundary 
    64! 
    75! DESCRIPTION: 
     
    106104!> 
    107105!> @author J.Paul 
    108 ! REVISION HISTORY: 
     106!> 
    109107!> @date November, 2013 - Initial Version 
    110108!> @date September, 2014  
     
    119117!> @todo add schematic to boundary structure description 
    120118!>  
    121 !> @note Software governed by the CeCILL licence     (./LICENSE) 
     119!> @note Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    122120!---------------------------------------------------------------------- 
    123121MODULE boundary 
     122 
    124123   USE netcdf                          ! nf90 library                            
    125124   USE global                          ! global parameter 
     
    131130 
    132131   IMPLICIT NONE 
     132 
    133133   ! NOTE_avoid_public_variables_if_possible 
    134134 
     
    220220 
    221221CONTAINS 
     222   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     223   FUNCTION boundary__copy_arr(td_bdy) & 
     224         & RESULT (tf_bdy) 
    222225   !------------------------------------------------------------------- 
    223226   !> @brief 
     
    240243   !> @return copy of input array of boundary structure  
    241244   !------------------------------------------------------------------- 
    242    FUNCTION boundary__copy_arr( td_bdy ) 
     245 
    243246      IMPLICIT NONE 
     247 
    244248      ! Argument 
    245       TYPE(TBDY), DIMENSION(:), INTENT(IN)  :: td_bdy 
     249      TYPE(TBDY), DIMENSION(:)   , INTENT(IN) :: td_bdy 
     250 
    246251      ! function 
    247       TYPE(TBDY), DIMENSION(SIZE(td_bdy(:))) :: boundary__copy_arr 
     252      TYPE(TBDY), DIMENSION(SIZE(td_bdy(:)))  :: tf_bdy 
    248253 
    249254      ! local variable 
     
    253258 
    254259      DO jk=1,SIZE(td_bdy(:)) 
    255          boundary__copy_arr(jk)=boundary_copy(td_bdy(jk)) 
     260         tf_bdy(jk)=boundary_copy(td_bdy(jk)) 
    256261      ENDDO 
    257262 
    258263   END FUNCTION boundary__copy_arr 
     264   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     265   FUNCTION boundary__copy_unit(td_bdy) & 
     266         & RESULT (tf_bdy) 
    259267   !------------------------------------------------------------------- 
    260268   !> @brief 
     
    277285   !> @return copy of input boundary structure 
    278286   !------------------------------------------------------------------- 
    279    FUNCTION boundary__copy_unit( td_bdy ) 
     287 
    280288      IMPLICIT NONE 
     289 
    281290      ! Argument 
    282291      TYPE(TBDY), INTENT(IN)  :: td_bdy 
     292 
    283293      ! function 
    284       TYPE(TBDY) :: boundary__copy_unit 
     294      TYPE(TBDY)              :: tf_bdy 
    285295 
    286296      ! local variable 
     
    290300 
    291301      ! copy variable name, id, .. 
    292       boundary__copy_unit%c_card     = TRIM(td_bdy%c_card) 
    293       boundary__copy_unit%i_nseg     = td_bdy%i_nseg 
    294       boundary__copy_unit%l_use      = td_bdy%l_use 
     302      tf_bdy%c_card     = TRIM(td_bdy%c_card) 
     303      tf_bdy%i_nseg     = td_bdy%i_nseg 
     304      tf_bdy%l_use      = td_bdy%l_use 
    295305 
    296306      ! copy segment 
    297       IF( ASSOCIATED(boundary__copy_unit%t_seg) )THEN 
    298          CALL seg__clean(boundary__copy_unit%t_seg(:)) 
    299          DEALLOCATE(boundary__copy_unit%t_seg) 
     307      IF( ASSOCIATED(tf_bdy%t_seg) )THEN 
     308         CALL seg__clean(tf_bdy%t_seg(:)) 
     309         DEALLOCATE(tf_bdy%t_seg) 
    300310      ENDIF 
    301       IF( ASSOCIATED(td_bdy%t_seg) .AND. boundary__copy_unit%i_nseg > 0 )THEN 
    302          ALLOCATE( boundary__copy_unit%t_seg(boundary__copy_unit%i_nseg) ) 
    303          DO ji=1,boundary__copy_unit%i_nseg 
    304             boundary__copy_unit%t_seg(ji)=td_bdy%t_seg(ji) 
     311      IF( ASSOCIATED(td_bdy%t_seg) .AND. tf_bdy%i_nseg > 0 )THEN 
     312         ALLOCATE( tf_bdy%t_seg(tf_bdy%i_nseg) ) 
     313         DO ji=1,tf_bdy%i_nseg 
     314            tf_bdy%t_seg(ji)=td_bdy%t_seg(ji) 
    305315         ENDDO 
    306316      ENDIF 
    307317 
    308318   END FUNCTION boundary__copy_unit 
     319   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     320   SUBROUTINE boundary__clean_unit(td_bdy) 
    309321   !------------------------------------------------------------------- 
    310322   !> @brief This subroutine clean boundary structure 
     
    312324   !> @author J.Paul 
    313325   !> @date November, 2013 - Initial Version 
     326   !> @date January, 2019 
     327   !> - nullify segment structure inside boundary structure  
    314328   ! 
    315329   !> @param[inout] td_bdy boundary strucutre 
    316330   !------------------------------------------------------------------- 
    317    SUBROUTINE boundary__clean_unit( td_bdy ) 
     331 
    318332      IMPLICIT NONE 
     333 
    319334      ! Argument 
    320335      TYPE(TBDY), INTENT(INOUT) :: td_bdy 
     
    334349         CALL seg__clean(td_bdy%t_seg(:) ) 
    335350         DEALLOCATE( td_bdy%t_seg ) 
     351         NULLIFY(td_bdy%t_seg) 
    336352      ENDIF 
    337353 
     
    340356 
    341357   END SUBROUTINE boundary__clean_unit 
     358   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     359   SUBROUTINE boundary__clean_arr(td_bdy) 
    342360   !------------------------------------------------------------------- 
    343361   !> @brief This subroutine clean array of boundary structure 
     
    348366   !> @param[inout] td_bdy boundary strucutre 
    349367   !------------------------------------------------------------------- 
    350    SUBROUTINE boundary__clean_arr( td_bdy ) 
     368 
    351369      IMPLICIT NONE 
     370 
    352371      ! Argument 
    353372      TYPE(TBDY), DIMENSION(:), INTENT(INOUT) :: td_bdy 
     
    363382 
    364383   END SUBROUTINE boundary__clean_arr 
     384   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     385   FUNCTION boundary_set_filename(cd_file, cd_card, id_seg, cd_date) & 
     386         &  RESULT (cf_file) 
    365387   !-------------------------------------------------------------------  
    366388   !> @brief This function put cardinal name and date inside file name. 
     
    389411   !> @return file name with cardinal name inside 
    390412   !-------------------------------------------------------------------  
    391    FUNCTION boundary_set_filename(cd_file, cd_card, id_seg, cd_date)  
     413 
    392414      IMPLICIT NONE  
     415 
    393416      ! Argument 
    394417      CHARACTER(LEN=*), INTENT(IN) :: cd_file 
     
    398421 
    399422      ! function  
    400       CHARACTER(LEN=lc) :: boundary_set_filename 
     423      CHARACTER(LEN=lc)            :: cf_file 
    401424 
    402425      ! local variable  
     
    415438      !----------------------------------------------------------------  
    416439      ! init 
    417       boundary_set_filename='' 
     440      cf_file='' 
    418441 
    419442      IF( TRIM(cd_file) /= '' .AND. TRIM(cd_card) /= '' )THEN 
     
    455478         ENDIF 
    456479 
    457          boundary_set_filename=TRIM(cl_dirname)//"/"//TRIM(cl_name) 
     480         cf_file=TRIM(cl_dirname)//"/"//TRIM(cl_name) 
    458481      ELSE 
    459482         CALL logger_error("BOUNDARY SET FILENAME: file or cardinal name "//& 
     
    462485  
    463486   END FUNCTION boundary_set_filename  
     487   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     488   FUNCTION boundary__init_wrapper(td_var,                               & 
     489         &                         ld_north, ld_south, ld_east, ld_west, & 
     490         &                         cd_north, cd_south, cd_east, cd_west, & 
     491         &                         ld_oneseg) & 
     492         &  RESULT (tf_bdy) 
    464493   !-------------------------------------------------------------------  
    465494   !> @brief This function initialise a boundary structure. 
     
    503532   !> @return boundary structure 
    504533   !-------------------------------------------------------------------  
    505    FUNCTION boundary__init_wrapper(td_var, & 
    506    &                               ld_north, ld_south, ld_east, ld_west, & 
    507    &                               cd_north, cd_south, cd_east, cd_west, & 
    508    &                               ld_oneseg )  
     534 
    509535      IMPLICIT NONE  
     536 
    510537      ! Argument 
    511538      TYPE(TVAR)       , INTENT(IN) :: td_var 
     
    521548 
    522549      ! function  
    523       TYPE(TBDY), DIMENSION(ip_ncard) :: boundary__init_wrapper 
     550      TYPE(TBDY)       , DIMENSION(ip_ncard)  :: tf_bdy 
    524551 
    525552      ! local variable  
     
    532559      CHARACTER(LEN=lc), DIMENSION(ip_ncard) :: cl_card 
    533560 
    534       TYPE(TBDY)       , DIMENSION(ip_ncard) :: tl_bdy 
    535561      TYPE(TBDY)                             :: tl_tmp 
    536562 
     
    555581 
    556582         ! init 
    557          tl_bdy(jp_north)=boundary__init('north',ld_north) 
    558          tl_bdy(jp_south)=boundary__init('south',ld_south) 
    559          tl_bdy(jp_east )=boundary__init('east ',ld_east ) 
    560          tl_bdy(jp_west )=boundary__init('west ',ld_west ) 
     583         tf_bdy(jp_north)=boundary__init('north',ld_north) 
     584         tf_bdy(jp_south)=boundary__init('south',ld_south) 
     585         tf_bdy(jp_east )=boundary__init('east ',ld_east ) 
     586         tf_bdy(jp_west )=boundary__init('west ',ld_west ) 
    561587 
    562588         ! if EW cyclic no east west boundary and force to use one segment 
     
    564590            CALL logger_info("BOUNDARY INIT: cyclic domain, "//& 
    565591            &  "no East West boundary") 
    566             tl_bdy(jp_east )%l_use=.FALSE. 
    567             tl_bdy(jp_west )%l_use=.FALSE. 
     592            tf_bdy(jp_east )%l_use=.FALSE. 
     593            tf_bdy(jp_west )%l_use=.FALSE. 
    568594 
    569595            CALL logger_info("BOUNDARY INIT: force to use one segment due"//& 
     
    618644            tl_seg=seg__init(il_index(jk),il_width,il_min(jk),il_max(jk)) 
    619645 
    620             IF( tl_bdy(jk)%l_use )THEN 
     646            IF( tf_bdy(jk)%l_use )THEN 
    621647 
    622648               ! get namelist information 
     
    625651               ! get segments indices 
    626652               DO ji=1,tl_tmp%i_nseg 
    627                   CALL boundary__add_seg(tl_bdy(jk),tl_tmp%t_seg(ji)) 
     653                  CALL boundary__add_seg(tf_bdy(jk),tl_tmp%t_seg(ji)) 
    628654               ENDDO 
    629655               ! indices from namelist or not 
    630                tl_bdy(jk)%l_nam=tl_tmp%l_nam 
     656               tf_bdy(jk)%l_nam=tl_tmp%l_nam 
    631657 
    632658               CALL boundary_clean(tl_tmp) 
    633659 
    634                IF( tl_bdy(jk)%i_nseg == 0 )THEN 
     660               IF( tf_bdy(jk)%i_nseg == 0 )THEN 
    635661                  ! add default segment 
    636                   CALL boundary__add_seg(tl_bdy(jk),tl_seg) 
     662                  CALL boundary__add_seg(tf_bdy(jk),tl_seg) 
    637663               ELSE 
    638664                  ! fill undefined value 
    639                   WHERE( tl_bdy(jk)%t_seg(:)%i_index == 0 )  
    640                      tl_bdy(jk)%t_seg(:)%i_index = tl_seg%i_index 
     665                  WHERE( tf_bdy(jk)%t_seg(:)%i_index == 0 )  
     666                     tf_bdy(jk)%t_seg(:)%i_index = tl_seg%i_index 
    641667                  END WHERE                
    642                   WHERE( tl_bdy(jk)%t_seg(:)%i_width == 0 )  
    643                      tl_bdy(jk)%t_seg(:)%i_width = tl_seg%i_width 
     668                  WHERE( tf_bdy(jk)%t_seg(:)%i_width == 0 )  
     669                     tf_bdy(jk)%t_seg(:)%i_width = tl_seg%i_width 
    644670                  END WHERE 
    645                   WHERE( tl_bdy(jk)%t_seg(:)%i_first == 0 )  
    646                      tl_bdy(jk)%t_seg(:)%i_first = tl_seg%i_first 
     671                  WHERE( tf_bdy(jk)%t_seg(:)%i_first == 0 )  
     672                     tf_bdy(jk)%t_seg(:)%i_first = tl_seg%i_first 
    647673                  END WHERE 
    648                   WHERE( tl_bdy(jk)%t_seg(:)%i_last == 0 )  
    649                      tl_bdy(jk)%t_seg(:)%i_last = tl_seg%i_last 
     674                  WHERE( tf_bdy(jk)%t_seg(:)%i_last == 0 )  
     675                     tf_bdy(jk)%t_seg(:)%i_last = tl_seg%i_last 
    650676                  END WHERE 
    651677               ENDIF 
     
    657683         ENDDO 
    658684 
    659          CALL boundary_get_indices(tl_bdy(:), td_var, ll_oneseg) 
    660  
    661          CALL boundary_check(tl_bdy, td_var) 
    662  
    663          boundary__init_wrapper(:)=boundary_copy(tl_bdy(:)) 
    664  
    665          ! clean 
    666          DO jk=1,ip_ncard 
    667             CALL boundary_clean(tl_bdy(jk)) 
    668          ENDDO 
     685         CALL boundary_get_indices(tf_bdy(:), td_var, ll_oneseg) 
     686 
     687         CALL boundary_check(tf_bdy, td_var) 
    669688 
    670689      ENDIF 
    671690  
    672691   END FUNCTION boundary__init_wrapper  
     692   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     693   FUNCTION boundary__init(cd_card, ld_use, ld_nam, td_seg) & 
     694         &  RESULT (tf_bdy) 
    673695   !-------------------------------------------------------------------  
    674696   !> @brief This function initialise basically a boundary structure with 
     
    687709   !> @return boundary structure 
    688710   !-------------------------------------------------------------------  
    689    FUNCTION boundary__init( cd_card, ld_use, ld_nam, td_seg )  
     711 
    690712      IMPLICIT NONE  
     713 
    691714      ! Argument 
    692715      CHARACTER(LEN=*), INTENT(IN) :: cd_card 
     
    696719 
    697720      ! function  
    698       TYPE(TBDY) :: boundary__init 
     721      TYPE(TBDY)                   :: tf_bdy 
    699722 
    700723      ! local variable  
    701        
    702724      ! loop indices  
    703725      !----------------------------------------------------------------  
     
    706728         CASE ('north','south','east','west') 
    707729          
    708             boundary__init%c_card=TRIM(cd_card) 
    709  
    710             boundary__init%l_use=.TRUE. 
    711             IF( PRESENT(ld_use) ) boundary__init%l_use=ld_use 
    712  
    713             boundary__init%l_nam=.FALSE. 
    714             IF( PRESENT(ld_nam) ) boundary__init%l_nam=ld_nam 
     730            tf_bdy%c_card=TRIM(cd_card) 
     731 
     732            tf_bdy%l_use=.TRUE. 
     733            IF( PRESENT(ld_use) ) tf_bdy%l_use=ld_use 
     734 
     735            tf_bdy%l_nam=.FALSE. 
     736            IF( PRESENT(ld_nam) ) tf_bdy%l_nam=ld_nam 
    715737 
    716738            IF( PRESENT(td_seg) )THEN 
    717                CALL boundary__add_seg(boundary__init, td_seg) 
     739               CALL boundary__add_seg(tf_bdy, td_seg) 
    718740            ENDIF 
    719741 
     
    723745 
    724746   END FUNCTION boundary__init 
     747   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     748   SUBROUTINE boundary__add_seg(td_bdy, td_seg)  
    725749   !-------------------------------------------------------------------  
    726750   !> @brief This subroutine add one segment structure to a boundary structure  
     
    734758   !> @param[in] td_seg    segment structure   
    735759   !-------------------------------------------------------------------  
    736    SUBROUTINE boundary__add_seg(td_bdy, td_seg)  
     760 
    737761      IMPLICIT NONE  
     762 
    738763      ! Argument  
    739764      TYPE(TBDY), INTENT(INOUT) :: td_bdy 
     
    793818 
    794819   END SUBROUTINE boundary__add_seg  
     820   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     821   SUBROUTINE boundary__del_seg(td_bdy)  
    795822   !-------------------------------------------------------------------  
    796823   !> @brief This subroutine remove all segments of a boundary structure  
     
    803830   !> @param[inout]  td_bdy   boundary structure 
    804831   !-------------------------------------------------------------------  
    805    SUBROUTINE boundary__del_seg(td_bdy)  
     832 
    806833      IMPLICIT NONE  
     834 
    807835      ! Argument  
    808836      TYPE(TBDY), INTENT(INOUT) :: td_bdy 
     
    820848 
    821849   END SUBROUTINE boundary__del_seg  
     850   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     851   FUNCTION boundary__get_info(cd_card, id_jcard) & 
     852         & RESULT (tf_bdy) 
    822853   !-------------------------------------------------------------------  
    823854   !> @brief This function get information about boundary from string character.  
     
    839870   !> @return boundary structure 
    840871   !-------------------------------------------------------------------  
    841    FUNCTION boundary__get_info(cd_card, id_jcard)  
     872 
    842873      IMPLICIT NONE  
     874 
    843875      ! Argument  
    844876      CHARACTER(LEN=lc), INTENT(IN) :: cd_card 
     
    846878 
    847879      ! function  
    848       TYPE(TBDY) :: boundary__get_info 
     880      TYPE(TBDY)                    :: tf_bdy 
    849881 
    850882      ! local variable  
     
    876908         ! initialise boundary 
    877909         ! temporaty boundary, so it doesn't matter which caridnal is used 
    878          boundary__get_info=boundary__init('north',ld_nam=.TRUE.) 
     910         tf_bdy=boundary__init('north',ld_nam=.TRUE.) 
    879911 
    880912         il_ind1=SCAN(fct_lower(cl_seg),'(') 
     
    953985         IF( (tl_seg%i_first == 0 .AND.  tl_seg%i_last == 0) .OR. & 
    954986         &   (tl_seg%i_first /= 0 .AND.  tl_seg%i_last /= 0) )THEN 
    955             CALL boundary__add_seg(boundary__get_info, tl_seg) 
     987            CALL boundary__add_seg(tf_bdy, tl_seg) 
    956988         ELSE 
    957989            CALL logger_error("BOUNDARY INIT: first or last segment indices "//& 
     
    967999 
    9681000   END FUNCTION boundary__get_info  
     1001   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1002   SUBROUTINE boundary_get_indices(td_bdy, td_var, ld_oneseg)  
    9691003   !-------------------------------------------------------------------  
    9701004   !> @brief This subroutine get indices of each semgent for each boundary. 
     
    9891023   !> @param[in] ld_onseg  use only one sgment for each boundary  
    9901024   !-------------------------------------------------------------------  
    991    SUBROUTINE boundary_get_indices( td_bdy, td_var, ld_oneseg)  
     1025 
    9921026      IMPLICIT NONE  
     1027 
    9931028      ! Argument 
    9941029      TYPE(TBDY) , DIMENSION(ip_ncard), INTENT(INOUT) :: td_bdy 
     
    10571092 
    10581093   END SUBROUTINE boundary_get_indices  
     1094   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1095   SUBROUTINE boundary__get_seg_number(td_bdy, td_var)  
    10591096   !-------------------------------------------------------------------  
    10601097   !> @brief This subroutine compute the number of sea segment.  
     
    10731110   !> @param[in] td_var    variable structure  
    10741111   !-------------------------------------------------------------------  
    1075    SUBROUTINE boundary__get_seg_number( td_bdy, td_var)  
     1112 
    10761113      IMPLICIT NONE  
     1114 
    10771115      ! Argument 
    10781116      TYPE(TBDY) , INTENT(INOUT) :: td_bdy 
     
    11551193  
    11561194   END SUBROUTINE boundary__get_seg_number  
     1195   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1196   SUBROUTINE boundary__get_seg_indices(td_bdy, td_var, & 
     1197         &                              id_index, id_width, id_first, id_last)  
    11571198   !-------------------------------------------------------------------  
    11581199   !> @brief This subroutine get segment indices for one boundary. 
     
    11701211   !> @param[in] id_last   boundary last  indice 
    11711212   !-------------------------------------------------------------------  
    1172    SUBROUTINE boundary__get_seg_indices( td_bdy, td_var, & 
    1173    &                                     id_index, id_width, id_first, id_last)  
     1213 
    11741214      IMPLICIT NONE  
     1215 
    11751216      ! Argument 
    11761217      TYPE(TBDY) , INTENT(INOUT) :: td_bdy 
     
    13051346       
    13061347   END SUBROUTINE boundary__get_seg_indices  
     1348   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1349   SUBROUTINE boundary_check_corner(td_bdy, td_var) 
    13071350   !-------------------------------------------------------------------  
    13081351   !> @brief This subroutine check if there is boundary at corner, and  
     
    13221365   !> @param[in] td_var    variable structure 
    13231366   !-------------------------------------------------------------------  
    1324    SUBROUTINE boundary_check_corner( td_bdy, td_var ) 
     1367 
    13251368      IMPLICIT NONE  
     1369 
    13261370      ! Argument 
    13271371      TYPE(TBDY) , DIMENSION(ip_ncard), INTENT(INOUT) :: td_bdy 
     
    15201564 
    15211565   END SUBROUTINE boundary_check_corner  
     1566   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1567   SUBROUTINE boundary_check(td_bdy, td_var)  
    15221568   !-------------------------------------------------------------------  
    15231569   !> @brief This subroutine check boundary. 
     
    15361582   !> @param[in] td_var    variable structure  
    15371583   !-------------------------------------------------------------------  
    1538    SUBROUTINE boundary_check(td_bdy, td_var)  
     1584 
    15391585      IMPLICIT NONE  
     1586 
    15401587      ! Argument 
    15411588      TYPE(TBDY) , DIMENSION(ip_ncard), INTENT(INOUT) :: td_bdy 
     
    15941641 
    15951642   END SUBROUTINE boundary_check 
     1643   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1644   SUBROUTINE boundary_swap(td_var, td_bdy) 
    15961645   !------------------------------------------------------------------- 
    15971646   !> @brief This subroutine swap array for east and north boundary. 
     
    16051654   !> @param[in   ] td_bdy boundary strucutre 
    16061655   !------------------------------------------------------------------- 
    1607    SUBROUTINE boundary_swap( td_var, td_bdy ) 
     1656 
    16081657      IMPLICIT NONE 
     1658 
    16091659      ! Argument 
    16101660      TYPE(TVAR), INTENT(INOUT) :: td_var 
     
    16591709      ENDIF 
    16601710   END SUBROUTINE boundary_swap 
     1711   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1712   SUBROUTINE boundary__print_unit(td_bdy)  
    16611713   !-------------------------------------------------------------------  
    16621714   !> @brief This subroutine print information about one boundary.  
     
    16671719   !> @param[in] td_bdy boundary structure  
    16681720   !-------------------------------------------------------------------  
    1669    SUBROUTINE boundary__print_unit( td_bdy )  
     1721 
    16701722      IMPLICIT NONE  
     1723 
    16711724      ! Argument 
    16721725      TYPE(TBDY), INTENT(IN) :: td_bdy 
     1726 
    16731727      ! local variable  
    16741728      ! loop indices  
     
    16881742  
    16891743   END SUBROUTINE boundary__print_unit 
     1744   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1745   SUBROUTINE boundary__print_arr(td_bdy)  
    16901746   !-------------------------------------------------------------------  
    16911747   !> @brief This subroutine print information about a array of boundary  
     
    16981754   !> @param[in] td_bdy boundary structure  
    16991755   !-------------------------------------------------------------------  
    1700    SUBROUTINE boundary__print_arr( td_bdy )  
     1756 
    17011757      IMPLICIT NONE  
     1758 
    17021759      ! Argument 
    17031760      TYPE(TBDY), DIMENSION(:), INTENT(IN) :: td_bdy 
     1761 
    17041762      ! local variable  
    17051763      ! loop indices  
     
    17121770  
    17131771   END SUBROUTINE boundary__print_arr 
     1772   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1773   FUNCTION seg__copy_unit(td_seg) & 
     1774         & RESULT (tf_seg) 
    17141775   !------------------------------------------------------------------- 
    17151776   !> @brief 
     
    17311792   !> @return copy of input segment structure 
    17321793   !------------------------------------------------------------------- 
    1733    FUNCTION seg__copy_unit( td_seg ) 
     1794 
    17341795      IMPLICIT NONE 
     1796 
    17351797      ! Argument 
    17361798      TYPE(TSEG), INTENT(IN)  :: td_seg 
     1799 
    17371800      ! function 
    1738       TYPE(TSEG) :: seg__copy_unit 
     1801      TYPE(TSEG)              :: tf_seg 
    17391802 
    17401803      ! local variable 
     
    17431806 
    17441807      ! copy segment index, width, .. 
    1745       seg__copy_unit%i_index    = td_seg%i_index 
    1746       seg__copy_unit%i_width    = td_seg%i_width 
    1747       seg__copy_unit%i_first    = td_seg%i_first 
    1748       seg__copy_unit%i_last     = td_seg%i_last  
     1808      tf_seg%i_index    = td_seg%i_index 
     1809      tf_seg%i_width    = td_seg%i_width 
     1810      tf_seg%i_first    = td_seg%i_first 
     1811      tf_seg%i_last     = td_seg%i_last  
    17491812 
    17501813   END FUNCTION seg__copy_unit 
     1814   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1815   FUNCTION seg__copy_arr(td_seg) & 
     1816         & RESULT (tf_seg) 
    17511817   !------------------------------------------------------------------- 
    17521818   !> @brief 
     
    17681834   !> @return copy of input array of segment structure 
    17691835   !------------------------------------------------------------------- 
    1770    FUNCTION seg__copy_arr( td_seg ) 
     1836 
    17711837      IMPLICIT NONE 
     1838 
    17721839      ! Argument 
    1773       TYPE(TSEG), DIMENSION(:), INTENT(IN)  :: td_seg 
     1840      TYPE(TSEG), DIMENSION(:), INTENT(IN)   :: td_seg 
     1841 
    17741842      ! function 
    1775       TYPE(TSEG), DIMENSION(SIZE(td_seg(:))) :: seg__copy_arr 
     1843      TYPE(TSEG), DIMENSION(SIZE(td_seg(:))) :: tf_seg 
    17761844 
    17771845      ! local variable 
     
    17811849 
    17821850      DO ji=1,SIZE(td_seg(:)) 
    1783          seg__copy_arr(ji)=seg__copy(td_seg(ji)) 
     1851         tf_seg(ji)=seg__copy(td_seg(ji)) 
    17841852      ENDDO 
    17851853 
    17861854   END FUNCTION seg__copy_arr 
     1855   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1856   FUNCTION seg__init(id_index, id_width, id_first, id_last) & 
     1857         &  RESULT(tf_seg) 
    17871858   !-------------------------------------------------------------------  
    17881859   !> @brief This function  initialise segment structure. 
     
    18011872   !> @return segment structure 
    18021873   !-------------------------------------------------------------------  
    1803    FUNCTION seg__init( id_index, id_width, id_first, id_last )  
     1874 
    18041875      IMPLICIT NONE  
     1876 
    18051877      ! Argument 
    18061878      INTEGER(i4), INTENT(IN) :: id_index 
     
    18101882 
    18111883      ! function  
    1812       TYPE(TSEG) :: seg__init 
     1884      TYPE(TSEG)              :: tf_seg 
    18131885 
    18141886      ! local variable  
     
    18171889      !----------------------------------------------------------------  
    18181890 
    1819       seg__init%i_index=id_index 
    1820  
    1821       IF( PRESENT(id_width) ) seg__init%i_width=id_width 
    1822       IF( PRESENT(id_first) ) seg__init%i_first=id_first 
    1823       IF( PRESENT(id_last ) ) seg__init%i_last =id_last 
     1891      tf_seg%i_index=id_index 
     1892 
     1893      IF( PRESENT(id_width) ) tf_seg%i_width=id_width 
     1894      IF( PRESENT(id_first) ) tf_seg%i_first=id_first 
     1895      IF( PRESENT(id_last ) ) tf_seg%i_last =id_last 
    18241896 
    18251897   END FUNCTION seg__init  
     1898   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1899   SUBROUTINE seg__clean_unit(td_seg)  
    18261900   !-------------------------------------------------------------------  
    18271901   !> @brief This subroutine clean segment structure.  
     
    18321906   !> @param[inout] td_seg segment structure 
    18331907   !-------------------------------------------------------------------  
    1834    SUBROUTINE seg__clean_unit(td_seg)  
     1908 
    18351909      IMPLICIT NONE  
     1910 
    18361911      ! Argument        
    18371912      TYPE(TSEG), INTENT(INOUT) :: td_seg 
     1913 
    18381914      ! local variable  
    18391915      TYPE(TSEG) :: tl_seg 
     
    18441920  
    18451921   END SUBROUTINE seg__clean_unit 
     1922   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1923   SUBROUTINE seg__clean_arr(td_seg)  
    18461924   !-------------------------------------------------------------------  
    18471925   !> @brief This subroutine clean segment structure.  
     
    18521930   !> @param[inout] td_seg array of segment structure 
    18531931   !-------------------------------------------------------------------  
    1854    SUBROUTINE seg__clean_arr(td_seg)  
     1932 
    18551933      IMPLICIT NONE  
     1934 
    18561935      ! Argument        
    18571936      TYPE(TSEG), DIMENSION(:), INTENT(INOUT) :: td_seg 
     1937 
    18581938      ! local variable  
    18591939      ! loop indices  
     
    18661946  
    18671947   END SUBROUTINE seg__clean_arr  
     1948   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    18681949END MODULE boundary 
  • utils/tools/SIREN/src/create_bathy.f90

    r9598 r12080  
    33!---------------------------------------------------------------------- 
    44! 
    5 ! PROGRAM: create_bathy 
    6 ! 
    75! DESCRIPTION: 
    86!> @file 
    9 !> @brief  
    107!> This program creates fine grid bathymetry file. 
    118!> 
    12 !> @details 
    139!> @section sec1 method 
    14 !> Bathymetry could be extracted from fine grid Bathymetry file, interpolated 
    15 !> from coarse grid Bathymetry file, or manually written. 
     10!> This bathymetry could be : 
     11!> - extracted from a wider fine grid bathymetry file 
     12!> - interpolated from a wider coarse grid bathymetry file 
     13!> - handwritten 
     14!> 
     15!> @image html  bathy_40.png  
     16!> <center>@image latex bathy_30.png 
     17!> </center> 
    1618!> 
    1719!> @section sec2 how to 
    18 !>    to create fine grid bathymetry file:<br/> 
    19 !> @code{.sh} 
    20 !>    ./SIREN/bin/create_bathy create_bathy.nam 
    21 !> @endcode 
    22 !> <br/>     
    23 !> \image html  bathy_40.png  
    24 !> <center>\image latex bathy_30.png 
    25 !> </center> 
    26 !> 
    27 !> @note  
    28 !>    you could find a template of the namelist in templates directory. 
    29 !> 
    30 !>    create_bathy.nam contains 7 namelists:<br/> 
    31 !>       - logger namelist (namlog) 
    32 !>       - config namelist (namcfg) 
    33 !>       - coarse grid namelist (namcrs) 
    34 !>       - fine grid namelist (namfin) 
    35 !>       - variable namelist (namvar) 
    36 !>       - nesting namelist (namnst) 
    37 !>       - output namelist (namout) 
    38 !>     
    39 !>    * _logger namelist (namlog)_:<br/> 
    40 !>       - cn_logfile   : log filename 
    41 !>       - cn_verbosity : verbosity ('trace','debug','info', 
    42 !> 'warning','error','fatal','none') 
    43 !>       - in_maxerror  : maximum number of error allowed 
    44 !> 
    45 !>    * _config namelist (namcfg)_:<br/> 
    46 !>       - cn_varcfg : variable configuration file  
    47 !> (see ./SIREN/cfg/variable.cfg) 
    48 !>       - cn_dimcfg : dimension configuration file. defines dimension allowed 
    49 !> (see ./SIREN/cfg/dimension.cfg). 
    50 !>       - cn_dumcfg : useless (dummy) configuration file, for useless  
    51 !> dimension or variable (see ./SIREN/cfg/dummy.cfg). 
    52 !> 
    53 !>    * _coarse grid namelist (namcrs)_:<br/> 
    54 !>       - cn_coord0 : coordinate file 
    55 !>       - in_perio0 : NEMO periodicity index (see Model Boundary Condition in 
    56 !> [NEMO documentation](http://www.nemo-ocean.eu/About-NEMO/Reference-manuals)) 
    57 !> 
    58 !>    * _fine grid namelist (namfin)_:<br/> 
    59 !>       - cn_coord1 : coordinate file 
    60 !>       - in_perio1 : periodicity index 
    61 !>       - ln_fillclosed : fill closed sea or not (default is .TRUE.) 
    62 !> 
    63 !>    * _variable namelist (namvar)_:<br/> 
    64 !>       - cn_varfile : list of variable, and corresponding file.<br/>  
    65 !>          *cn_varfile* is the path and filename of the file where find 
    66 !>          variable. 
    67 !>          @note  
    68 !>             *cn_varfile* could be a matrix of value, if you want to filled 
    69 !>             manually variable value.<br/> 
    70 !>             the variable array of value is split into equal subdomain.<br/> 
    71 !>             Each subdomain is filled with the corresponding value  
    72 !>             of the matrix.<br/>           
    73 !>             separators used to defined matrix are: 
    74 !>                - ',' for line 
    75 !>                - '/' for row 
    76 !>                Example:<br/> 
    77 !>                   3,2,3/1,4,5  =>  @f$ \left( \begin{array}{ccc} 
    78 !>                                         3 & 2 & 3 \\ 
    79 !>                                         1 & 4 & 5 \end{array} \right) @f$ 
    80 !> 
    81 !>          Examples:  
    82 !>             - 'Bathymetry:gridT.nc' 
    83 !>             - 'Bathymetry:5000,5000,5000/5000,3000,5000/5000,5000,5000' 
    84 !> 
    85 !>       - cn_varinfo : list of variable and extra information about request(s)  
    86 !>       to be used.<br/> 
    87 !>          each elements of *cn_varinfo* is a string character 
    88 !>          (separated by ',').<br/> 
    89 !>          it is composed of the variable name follow by ':',  
    90 !>          then request(s) to be used on this variable.<br/>  
    91 !>          request could be: 
    92 !>             - int = interpolation method 
    93 !>             - ext = extrapolation method 
    94 !>             - flt = filter method 
    95 !>             - min = minimum value 
    96 !>             - max = maximum value 
    97 !>             - unt = new units 
    98 !>             - unf = unit scale factor (linked to new units) 
    99 !> 
    100 !>                requests must be separated by ';'.<br/> 
    101 !>                order of requests does not matter.<br/> 
    102 !> 
    103 !>          informations about available method could be find in @ref interp, 
    104 !>          @ref extrap and @ref filter modules.<br/> 
    105 !>          Example: 'Bathymetry: flt=2*hamming(2,3); min=0' 
    106 !>          @note  
    107 !>             If you do not specify a method which is required,  
    108 !>             default one is apply. 
    109 !>          @warning  
    110 !>             variable name must be __Bathymetry__ here. 
    111 !> 
    112 !>    * _nesting namelist (namnst)_:<br/> 
    113 !>       - in_rhoi  : refinement factor in i-direction 
    114 !>       - in_rhoj  : refinement factor in j-direction 
     20!> USAGE: create_bathy create_bathy.nam [-v] [-h]<br/> 
     21!>    - positional arguments:<br/> 
     22!>       - create_bathy.nam<br/> 
     23!>          namelist of create_bathy 
     24!>          @note 
     25!>             a template of the namelist could be created running (in templates directory): 
     26!>             @code{.sh} 
     27!>                python create_templates.py create_bathy 
     28!>             @endcode 
     29!> 
     30!>    - optional arguments:<br/> 
     31!>       - -h, --help<br/> 
     32!>          show this help message (and exit)<br/> 
     33!>       - -v, --version<br/> 
     34!>          show Siren's version   (and exit) 
     35!> 
     36!> @section sec_bathy create_bathy.nam 
     37!>    create_bathy.nam contains 7 sub-namelists:<br/> 
     38!>       - **namlog** to set logger parameters 
     39!>       - **namcfg** to set configuration file parameters 
     40!>       - **namsrc** to set source/coarse grid parameters 
     41!>       - **namtgt** to set target/fine grid parameters 
     42!>       - **namvar** to set variable parameters 
     43!>       - **namnst** to set sub domain and nesting paramters 
     44!>       - **namout** to set output parameters 
     45!> 
     46!>    here after, each sub-namelist parameters is detailed. 
     47!>    @note  
     48!>       default values are specified between brackets 
     49!> 
     50!> @subsection sublog namlog 
     51!>    the logger sub-namelist parameters are : 
     52!> 
     53!>    - **cn_logfile** [@a create_bathy.log]<br/> 
     54!>       logger filename 
     55!> 
     56!>    - **cn_verbosity** [@a warning]<br/> 
     57!>       verbosity level, choose between : 
     58!>          - trace 
     59!>          - debug 
     60!>          - info 
     61!>          - warning 
     62!>          - error 
     63!>          - fatal 
     64!>          - none 
     65!> 
     66!>    - **in_maxerror** [@a 5]<br/>  
     67!>       maximum number of error allowed 
     68!> 
     69!> @subsection subcfg namcfg 
     70!>    the configuration sub-namelist parameters are : 
     71!> 
     72!>    - **cn_varcfg** [@a ./cfg/variable.cfg]<br/> 
     73!>       path to the variable configuration file.<br/> 
     74!>       the variable configuration file defines standard name,  
     75!>       default interpolation method, axis,...  
     76!>       to be used for some known variables.<br/>  
     77!> 
     78!>    - **cn_dimcfg** [@a ./cfg/dimension.cfg]<br/>  
     79!>       path to the dimension configuration file.<br/>  
     80!>       the dimension configuration file defines dimensions allowed.<br/>  
     81!> 
     82!>    - **cn_dumcfg** [@a ./cfg/dummy.cfg]<br/>  
     83!>       path to the useless (dummy) configuration file.<br/> 
     84!>       the dummy configuration file defines useless  
     85!>       dimension or variable. these dimension(s) or variable(s) will not be 
     86!>       processed.<br/> 
     87!> 
     88!> @subsection subsrc namsrc  
     89!>    the source/coarse grid sub-namelist parameters are : 
     90!> 
     91!>    - **cn_coord0** [@a ]<br/>  
     92!>       path to the coordinate file 
     93!> 
     94!>    - **in_perio0** [@a ]<br/>  
     95!>       NEMO periodicity index<br/>  
     96!>       the NEMO periodicity could be choose between 0 to 6: 
     97!>       <dl> 
     98!>          <dt>in_perio=0</dt> 
     99!>          <dd>standard regional model</dd> 
     100!>          <dt>in_perio=1</dt> 
     101!>          <dd>east-west cyclic model</dd> 
     102!>          <dt>in_perio=2</dt> 
     103!>          <dd>model with symmetric boundary condition across the equator</dd> 
     104!>          <dt>in_perio=3</dt> 
     105!>          <dd>regional model with North fold boundary and T-point pivot</dd> 
     106!>          <dt>in_perio=4</dt> 
     107!>          <dd>global model with a T-point pivot.<br/> 
     108!>          example: ORCA2, ORCA025, ORCA12</dd> 
     109!>          <dt>in_perio=5</dt> 
     110!>          <dd>regional model with North fold boundary and F-point pivot</dd> 
     111!>          <dt>in_perio=6</dt> 
     112!>          <dd>global model with a F-point pivot<br/> 
     113!>          example: ORCA05</dd> 
     114!>          </dd> 
     115!>       </dl> 
     116!>       @sa For more information see @ref md_src_docsrc_6_perio 
     117!>       and Model Boundary Condition paragraph in the  
     118!>       [NEMO documentation](https://forge.ipsl.jussieu.fr/nemo/chrome/site/doc/NEMO/manual/pdf/NEMO_manual.pdf) 
     119!> 
     120!> @subsection subtgt namtgt  
     121!>    the target/fine grid sub-namelist parameters are : 
     122!> 
     123!>    - **cn_coord1** [@a ]<br/>  
     124!>       path to coordinate file 
     125!> 
     126!>    - **in_perio1** [@a ]<br/> 
     127!>       NEMO periodicity index (see above) 
     128!>    @note if the fine/target coordinates file (cn_coord1) was created by SIREN, you do 
     129!>    not need to fill this parameter. SIREN will read it on the global attributes of 
     130!>    the coordinates file. 
     131!> 
     132!>    - **ln_fillclosed** [@a .TRUE.]<br/> 
     133!>       logical to fill closed sea or not 
     134!> 
     135!> @subsection subvar namvar  
     136!>    the variable sub-namelist parameters are : 
     137!> 
     138!>    - **cn_varfile** [@a ]<br/>  
     139!>       list of variable, and associated file  
     140!>       @warning  
     141!>          variable name must be __Bathymetry__ here. 
     142!> 
     143!>       *cn_varfile* is the path and filename of the file where find 
     144!>       variable. 
    115145!>       @note  
    116 !>          coarse grid indices will be deduced from fine grid 
    117 !>          coordinate file. 
    118 !> 
    119 !>    * _output namelist (namout)_:<br/> 
    120 !>       - cn_fileout : output bathymetry file 
    121 !> 
     146!>          *cn_varfile* could be a matrix of value, if you want to handwrite 
     147!>          variable value.<br/> 
     148!>          the variable array of value is split into equal subdomain.<br/> 
     149!>          each subdomain is filled with the corresponding value  
     150!>          of the matrix.<br/>           
     151!>          separators used to defined matrix are: 
     152!>             - ',' for line 
     153!>             - '/' for row 
     154!>             Example:<br/> 
     155!>                3,2,3/1,4,5  =>  @f$ \left( \begin{array}{ccc} 
     156!>                                      3 & 2 & 3 \\ 
     157!>                                      1 & 4 & 5 \end{array} \right) @f$ 
     158!> 
     159!>       Examples:  
     160!>          - 'Bathymetry:gridT.nc' 
     161!>          - 'Bathymetry:5000,5000,5000/5000,3000,5000/5000,5000,5000'<br/> 
     162!> 
     163!>       @note  
     164!>          Optionnaly, NEMO periodicity could be added following the filename. 
     165!>          the periodicity must be separated by ';' 
     166!> 
     167!>       Example: 
     168!>          - 'Bathymetry:gridT.nc ; perio=4'<br/> 
     169!> 
     170!>    - **cn_varinfo** [@a ]<br/>  
     171!>       list of variable and extra information about request(s) to be used<br/> 
     172!> 
     173!>       each elements of *cn_varinfo* is a string character (separated by ',').<br/> 
     174!>       it is composed of the variable name follow by ':',  
     175!>       then request(s) to be used on this variable.<br/>  
     176!>       request could be: 
     177!>          - int = interpolation method 
     178!>          - ext = extrapolation method 
     179!>          - flt = filter method 
     180!>          - min = minimum value 
     181!>          - max = maximum value 
     182!>          - unt = new units 
     183!>          - unf = unit scale factor (linked to new units) 
     184!> 
     185!>             requests must be separated by ';'.<br/> 
     186!>             order of requests does not matter.<br/> 
     187!> 
     188!>       informations about available method could be find in @ref interp, 
     189!>       @ref extrap and @ref filter modules.<br/> 
     190!>       Example:  
     191!>          - 'Bathymetry: flt=2*hamming(2,3); min=0' 
     192!> 
     193!>       @note  
     194!>          If you do not specify a method which is required,  
     195!>          default one is apply. 
     196!> 
     197!>    - **ln_rand** [@a .False.]<br/>  
     198!>          logical to add random value to Bathymetry<br/> 
     199!>          Only for handmade Bathymetry.  
     200!>          A random value (+/- 0.1% of the maximum depth) will 
     201!>          will be added to avoid flat Bathymetry (which may cause issue). 
     202!> 
     203!> @subsection subnst namnst  
     204!>    the nesting sub-namelist parameters are : 
     205!> 
     206!>    - **in_rhoi**  [@a 1]<br/>  
     207!>       refinement factor in i-direction 
     208!> 
     209!>    - **in_rhoj**  [@a 1]<br/>  
     210!>       refinement factor in j-direction 
     211!> 
     212!>    @note  
     213!>       coarse grid indices will be deduced from fine grid 
     214!>       coordinate file. 
     215!> 
     216!> @subsection subout namout  
     217!>    the output sub-namelist parameter is : 
     218!> 
     219!>    - **cn_fileout** [@a bathy_fine.nc]<br/> 
     220!>       output bathymetry filename 
     221!> 
     222!> <hr> 
    122223!> @author J.Paul 
    123 ! REVISION HISTORY: 
     224!> 
    124225!> @date November, 2013 - Initial Version 
    125226!> @date Sepember, 2014  
     
    138239!> @date October, 2016 
    139240!> - dimension to be used select from configuration file 
    140 ! 
     241!> @date July, 2017 
     242!> - add random value to avoid flat bathymetry 
     243!> @date January, 2019 
     244!> - add option to add random value to a flat Bathymetry 
     245!> - create and clean file structure to avoid memory leaks 
     246!> - check dimension of matrix for 'handmade' bathymetry 
     247!> - add url path to global attributes of output file(s) 
     248!> @date February, 2019 
     249!> - rename sub namelist namcrs to namsrc 
     250!> - rename sub namelist namfin to namtgt 
     251!> @date August, 2019 
     252!> - use periodicity read from namelist, and store in multi structure 
     253!> @date Ocober, 2019 
     254!> - add help and version optional arguments 
     255!> 
    141256!> @todo 
    142257!> - check tl_multi is not empty 
    143258!> 
    144 !> @note Software governed by the CeCILL licence     (./LICENSE) 
     259!> @note Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    145260!---------------------------------------------------------------------- 
    146261PROGRAM create_bathy 
     
    168283   IMPLICIT NONE 
    169284 
     285   ! parameters 
     286   CHARACTER(LEN=lc), PARAMETER  :: cp_myname = "create_bathy" 
     287 
    170288   ! local variable 
     289   CHARACTER(LEN=lc)                                  :: cl_arg 
    171290   CHARACTER(LEN=lc)                                  :: cl_namelist 
    172291   CHARACTER(LEN=lc)                                  :: cl_date 
    173292   CHARACTER(LEN=lc)                                  :: cl_data 
     293   CHARACTER(LEN=lc)                                  :: cl_url 
     294   CHARACTER(LEN=lc)                                  :: cl_errormsg 
    174295 
    175296   INTEGER(i4)                                        :: il_narg 
    176297   INTEGER(i4)                                        :: il_status 
    177298   INTEGER(i4)                                        :: il_fileid 
     299   INTEGER(i4)                                        :: il_varid 
    178300   INTEGER(i4)                                        :: il_attid 
    179301   INTEGER(i4)                                        :: il_imin0 
     
    206328   TYPE(TDIM)       , DIMENSION(ip_maxdim)            :: tl_dim 
    207329 
     330   TYPE(TFILE)                                        :: tl_file 
     331 
    208332   TYPE(TMULTI)                                       :: tl_multi 
    209333 
     
    217341   ! namelist variable 
    218342   ! namlog 
    219    CHARACTER(LEN=lc)                       :: cn_logfile = 'create_bathy.log'  
    220    CHARACTER(LEN=lc)                       :: cn_verbosity = 'warning'  
    221    INTEGER(i4)                             :: in_maxerror = 5 
     343   CHARACTER(LEN=lc)                       :: cn_logfile    = 'create_bathy.log'  
     344   CHARACTER(LEN=lc)                       :: cn_verbosity  = 'warning'  
     345   INTEGER(i4)                             :: in_maxerror   = 5 
    222346 
    223347   ! namcfg 
    224    CHARACTER(LEN=lc)                       :: cn_varcfg = './cfg/variable.cfg'  
    225    CHARACTER(LEN=lc)                       :: cn_dimcfg = './cfg/dimension.cfg'  
    226    CHARACTER(LEN=lc)                       :: cn_dumcfg = './cfg/dummy.cfg'  
    227  
    228    ! namcrs 
    229    CHARACTER(LEN=lc)                       :: cn_coord0 = ''  
    230    INTEGER(i4)                             :: in_perio0 = -1 
    231  
    232    ! namfin 
    233    CHARACTER(LEN=lc)                       :: cn_coord1 = '' 
    234    INTEGER(i4)                             :: in_perio1 = -1 
     348   CHARACTER(LEN=lc)                       :: cn_varcfg  = './cfg/variable.cfg'  
     349   CHARACTER(LEN=lc)                       :: cn_dimcfg  = './cfg/dimension.cfg' 
     350   CHARACTER(LEN=lc)                       :: cn_dumcfg  = './cfg/dummy.cfg' 
     351 
     352   ! namsrc 
     353   CHARACTER(LEN=lc)                       :: cn_coord0  = ''  
     354   INTEGER(i4)                             :: in_perio0  = -1 
     355 
     356   ! namtgt 
     357   CHARACTER(LEN=lc)                       :: cn_coord1  = '' 
     358   INTEGER(i4)                             :: in_perio1  = -1 
    235359   LOGICAL                                 :: ln_fillclosed = .TRUE. 
    236360 
     
    238362   CHARACTER(LEN=lc), DIMENSION(ip_maxvar) :: cn_varfile = '' 
    239363   CHARACTER(LEN=lc), DIMENSION(ip_maxvar) :: cn_varinfo = '' 
     364   LOGICAL                                 :: ln_rand    = .FALSE. 
    240365 
    241366   ! namnst 
    242    INTEGER(i4)                             :: in_rhoi  = 1 
    243    INTEGER(i4)                             :: in_rhoj  = 1 
     367   INTEGER(i4)                             :: in_rhoi    = 1 
     368   INTEGER(i4)                             :: in_rhoj    = 1 
    244369 
    245370   ! namout 
     
    247372   !------------------------------------------------------------------- 
    248373 
    249    NAMELIST /namlog/ &   !< logger namelist 
    250    &  cn_logfile,    &   !< log file 
    251    &  cn_verbosity,  &   !< log verbosity 
    252    &  in_maxerror        !< logger maximum error 
    253  
    254    NAMELIST /namcfg/ &   !< configuration namelist 
    255    &  cn_varcfg, &       !< variable configuration file 
    256    &  cn_dimcfg, &       !< dimension configuration file 
    257    &  cn_dumcfg          !< dummy configuration file 
    258  
    259    NAMELIST /namcrs/ &   !< coarse grid namelist 
    260    &  cn_coord0,  &      !< coordinate file 
    261    &  in_perio0          !< periodicity index 
    262     
    263    NAMELIST /namfin/ &   !< fine grid namelist 
    264    &  cn_coord1,   &     !< coordinate file 
    265    &  in_perio1,   &     !< periodicity index 
    266    &  ln_fillclosed      !< fill closed sea 
     374   NAMELIST /namlog/ &  !< logger namelist 
     375   &  cn_logfile,    &  !< log file 
     376   &  cn_verbosity,  &  !< log verbosity 
     377   &  in_maxerror       !< logger maximum error 
     378 
     379   NAMELIST /namcfg/ &  !< configuration namelist 
     380   &  cn_varcfg,     &  !< variable configuration file 
     381   &  cn_dimcfg,     &  !< dimension configuration file 
     382   &  cn_dumcfg         !< dummy configuration file 
     383 
     384   NAMELIST /namsrc/ &  !< source/coarse grid namelist 
     385   &  cn_coord0,     &  !< coordinate file 
     386   &  in_perio0         !< periodicity index 
     387 
     388   NAMELIST /namtgt/ &  !< target/fine grid namelist 
     389   &  cn_coord1,     &  !< coordinate file 
     390   &  in_perio1,     &  !< periodicity index 
     391   &  ln_fillclosed     !< fill closed sea 
    267392  
    268    NAMELIST /namvar/ &   !< variable namelist 
    269    &  cn_varfile, &      !< list of variable file 
    270    &  cn_varinfo         !< list of variable and interpolation method to be used. (ex: 'votemper:linear','vosaline:cubic' ) 
    271     
    272    NAMELIST /namnst/ &   !< nesting namelist 
    273    &  in_rhoi,    &      !< refinement factor in i-direction 
    274    &  in_rhoj            !< refinement factor in j-direction 
    275  
    276    NAMELIST /namout/ &   !< output namlist 
    277    &  cn_fileout         !< fine grid bathymetry file 
     393   NAMELIST /namvar/ &  !< variable namelist 
     394   &  cn_varfile,    &  !< list of variable file 
     395   &  cn_varinfo,    &  !< list of variable and interpolation method to be used. (ex: 'votemper:linear','vosaline:cubic' ) 
     396   &  ln_rand           !< add random value to avoid flat bathymetry 
     397  
     398   NAMELIST /namnst/ &  !< nesting namelist 
     399   &  in_rhoi,       &  !< refinement factor in i-direction 
     400   &  in_rhoj           !< refinement factor in j-direction 
     401 
     402   NAMELIST /namout/ &  !< output namelist 
     403   &  cn_fileout        !< fine grid bathymetry file 
    278404   !------------------------------------------------------------------- 
    279405 
    280    ! namelist 
    281    ! get namelist 
     406   ! 
     407   ! Initialisation 
     408   ! -------------- 
     409   ! 
    282410   il_narg=COMMAND_ARGUMENT_COUNT() !f03 intrinsec 
    283    IF( il_narg/=1 )THEN 
    284       PRINT *,"ERROR in create_bathy: need a namelist" 
    285       STOP 
     411 
     412   ! Traitement des arguments fournis 
     413   ! -------------------------------- 
     414   IF( il_narg /= 1 )THEN 
     415      WRITE(cl_errormsg,*) ' ERROR : one argument is needed ' 
     416      CALL fct_help(cp_myname,cl_errormsg)  
     417      CALL EXIT(1) 
    286418   ELSE 
    287       CALL GET_COMMAND_ARGUMENT(1,cl_namelist) !f03 intrinsec 
     419 
     420      CALL GET_COMMAND_ARGUMENT(1,cl_arg) !f03 intrinsec 
     421      SELECT CASE (cl_arg) 
     422         CASE ('-v', '--version') 
     423 
     424            CALL fct_version(cp_myname) 
     425            CALL EXIT(0) 
     426 
     427         CASE ('-h', '--help') 
     428 
     429            CALL fct_help(cp_myname) 
     430            CALL EXIT(0) 
     431 
     432         CASE DEFAULT 
     433 
     434            cl_namelist=cl_arg 
     435 
     436            ! read namelist 
     437            INQUIRE(FILE=TRIM(cl_namelist), EXIST=ll_exist) 
     438            IF( ll_exist )THEN 
     439 
     440               il_fileid=fct_getunit() 
     441 
     442               OPEN( il_fileid, FILE=TRIM(cl_namelist),  & 
     443               &                FORM='FORMATTED',        & 
     444               &                ACCESS='SEQUENTIAL',     & 
     445               &                STATUS='OLD',            & 
     446               &                ACTION='READ',           & 
     447               &                IOSTAT=il_status) 
     448               CALL fct_err(il_status) 
     449               IF( il_status /= 0 )THEN 
     450                  WRITE(cl_errormsg,*) " ERROR : error opening "//TRIM(cl_namelist) 
     451                  CALL fct_help(cp_myname,cl_errormsg)  
     452                  CALL EXIT(1) 
     453               ENDIF 
     454 
     455               READ( il_fileid, NML = namlog ) 
     456  
     457               ! define logger file 
     458               CALL logger_open(TRIM(cn_logfile),TRIM(cn_verbosity),in_maxerror) 
     459               CALL logger_header() 
     460 
     461               READ( il_fileid, NML = namcfg ) 
     462               ! get variable extra information on configuration file 
     463               CALL var_def_extra(TRIM(cn_varcfg)) 
     464 
     465               ! get dimension allowed 
     466               CALL dim_def_extra(TRIM(cn_dimcfg)) 
     467 
     468               ! get dummy variable 
     469               CALL var_get_dummy(TRIM(cn_dumcfg)) 
     470               ! get dummy dimension 
     471               CALL dim_get_dummy(TRIM(cn_dumcfg)) 
     472               ! get dummy attribute 
     473               CALL att_get_dummy(TRIM(cn_dumcfg)) 
     474 
     475               READ( il_fileid, NML = namsrc ) 
     476               READ( il_fileid, NML = namtgt ) 
     477               READ( il_fileid, NML = namvar ) 
     478               ! add user change in extra information 
     479               CALL var_chg_extra( cn_varinfo ) 
     480               ! match variable with file 
     481               tl_multi=multi_init(cn_varfile) 
     482 
     483               READ( il_fileid, NML = namnst ) 
     484               READ( il_fileid, NML = namout ) 
     485 
     486               CLOSE( il_fileid, IOSTAT=il_status ) 
     487               CALL fct_err(il_status) 
     488               IF( il_status /= 0 )THEN 
     489                  CALL logger_error("CREATE BATHY: closing "//TRIM(cl_namelist)) 
     490               ENDIF 
     491 
     492            ELSE 
     493 
     494               WRITE(cl_errormsg,*) " ERROR : can't find "//TRIM(cl_namelist) 
     495               CALL fct_help(cp_myname,cl_errormsg)  
     496               CALL EXIT(1) 
     497 
     498            ENDIF 
     499 
     500      END SELECT 
    288501   ENDIF 
    289   
    290    ! read namelist 
    291    INQUIRE(FILE=TRIM(cl_namelist), EXIST=ll_exist) 
    292    IF( ll_exist )THEN 
    293   
    294       il_fileid=fct_getunit() 
    295  
    296       OPEN( il_fileid, FILE=TRIM(cl_namelist), & 
    297       &                FORM='FORMATTED',       & 
    298       &                ACCESS='SEQUENTIAL',    & 
    299       &                STATUS='OLD',           & 
    300       &                ACTION='READ',          & 
    301       &                IOSTAT=il_status) 
    302       CALL fct_err(il_status) 
    303       IF( il_status /= 0 )THEN 
    304          PRINT *,"ERROR in create_bathy: error opening "//TRIM(cl_namelist) 
    305          STOP 
    306       ENDIF 
    307  
    308       READ( il_fileid, NML = namlog ) 
    309       ! define log file 
    310       CALL logger_open(TRIM(cn_logfile),TRIM(cn_verbosity),in_maxerror) 
    311       CALL logger_header() 
    312  
    313       READ( il_fileid, NML = namcfg ) 
    314       ! get variable extra information 
    315       CALL var_def_extra(TRIM(cn_varcfg)) 
    316  
    317       ! get dimension allowed 
    318       CALL dim_def_extra(TRIM(cn_dimcfg)) 
    319  
    320       ! get dummy variable 
    321       CALL var_get_dummy(TRIM(cn_dumcfg)) 
    322       ! get dummy dimension 
    323       CALL dim_get_dummy(TRIM(cn_dumcfg)) 
    324       ! get dummy attribute 
    325       CALL att_get_dummy(TRIM(cn_dumcfg)) 
    326  
    327       READ( il_fileid, NML = namcrs ) 
    328       READ( il_fileid, NML = namfin ) 
    329       READ( il_fileid, NML = namvar ) 
    330       ! add user change in extra information 
    331       CALL var_chg_extra( cn_varinfo ) 
    332       ! match variable with file 
    333       tl_multi=multi_init(cn_varfile) 
    334   
    335       READ( il_fileid, NML = namnst ) 
    336       READ( il_fileid, NML = namout ) 
    337  
    338       CLOSE( il_fileid, IOSTAT=il_status ) 
    339       CALL fct_err(il_status) 
    340       IF( il_status /= 0 )THEN 
    341          CALL logger_error("CREATE BATHY: closing "//TRIM(cl_namelist)) 
    342       ENDIF 
    343  
    344    ELSE 
    345  
    346       PRINT *,"ERROR in create_bathy: can't find "//TRIM(cl_namelist) 
    347       STOP 
    348  
    349    ENDIF 
    350502 
    351503   CALL multi_print(tl_multi) 
    352504 
    353505   ! open files 
    354    IF( cn_coord0 /= '' )THEN 
    355       tl_coord0=mpp_init( file_init(TRIM(cn_coord0)), id_perio=in_perio0) 
     506   IF( TRIM(cn_coord0) /= '' )THEN 
     507      tl_file=file_init(TRIM(cn_coord0)) 
     508      tl_coord0=mpp_init( tl_file, id_perio=in_perio0) 
     509      ! clean 
     510      CALL file_clean(tl_file) 
    356511      CALL grid_get_info(tl_coord0) 
    357512   ELSE 
     
    361516 
    362517   IF( TRIM(cn_coord1) /= '' )THEN 
    363       tl_coord1=mpp_init( file_init(TRIM(cn_coord1)),id_perio=in_perio1) 
     518      tl_file=file_init(TRIM(cn_coord1)) 
     519      tl_coord1=mpp_init( tl_file, id_perio=in_perio1) 
     520      ! clean 
     521      CALL file_clean(tl_file) 
    364522      CALL grid_get_info(tl_coord1) 
    365523   ELSE 
     
    430588               jk=jk+1 
    431589               tl_tmp=var_copy(tl_multi%t_mpp(ji)%t_proc(1)%t_var(jj)) 
    432              
    433                tl_var(jk)=create_bathy_matrix(tl_tmp, tl_coord1) 
     590 
     591               IF( COUNT(tl_tmp%t_dim(:)%l_use) > 2 )THEN 
     592                  CALL logger_fatal("CREATE BATHY: input matrix use more "//& 
     593                     &              "than 2D. Check namelist.") 
     594               ENDIF 
     595               tl_var(jk)=create_bathy_matrix(tl_tmp, tl_coord1, ln_rand) 
    434596            ENDDO 
    435597            ! clean 
     
    438600         ELSE 
    439601 
    440             tl_mpp=mpp_init( file_init(TRIM(tl_multi%t_mpp(ji)%c_name)) ) 
     602            tl_file=file_init(TRIM(tl_multi%t_mpp(ji)%c_name), & 
     603               &              id_perio=tl_multi%t_mpp(ji)%i_perio) 
     604            tl_mpp=mpp_init( tl_file ) 
     605 
     606            ! clean 
     607            CALL file_clean(tl_file) 
    441608            CALL grid_get_info(tl_mpp) 
    442609 
     
    459626                  jk=jk+1 
    460627                  tl_tmp=var_copy(tl_multi%t_mpp(ji)%t_proc(1)%t_var(jj)) 
    461                 
     628  
    462629                  tl_var(jk)=create_bathy_extract( tl_tmp, tl_mpp, & 
    463630                  &                                tl_coord1 ) 
     
    548715 
    549716      ! add longitude 
    550       tl_lon=iom_mpp_read_var(tl_coord1,'longitude') 
     717      il_varid=var_get_id(tl_coord1%t_proc(1)%t_var(:),'longitude') 
     718      IF( il_varid == 0 )THEN 
     719         il_varid=var_get_id(tl_coord1%t_proc(1)%t_var(:),'longitude_T') 
     720      ENDIF 
     721      tl_lon=iom_mpp_read_var(tl_coord1, il_varid) 
    551722      CALL file_add_var(tl_fileout, tl_lon) 
    552723      CALL var_clean(tl_lon) 
    553724 
    554725      ! add latitude 
    555       tl_lat=iom_mpp_read_var(tl_coord1,'latitude') 
     726      il_varid=var_get_id(tl_coord1%t_proc(1)%t_var(:),'latitude') 
     727      IF( il_varid == 0 )THEN 
     728         il_varid=var_get_id(tl_coord1%t_proc(1)%t_var(:),'latitude_T') 
     729      ENDIF 
     730      tl_lat=iom_mpp_read_var(tl_coord1, il_varid) 
    556731      CALL file_add_var(tl_fileout, tl_lat) 
    557732      CALL var_clean(tl_lat) 
     
    581756   DEALLOCATE(tl_var) 
    582757 
     758   ! clean 
     759   CALL multi_clean(tl_multi) 
     760 
    583761   ! add some attribute 
    584762   tl_att=att_init("Created_by","SIREN create_bathy") 
    585763   CALL file_add_att(tl_fileout, tl_att) 
    586764 
     765   !add source url 
     766   cl_url=fct_split(fct_split(cp_url,2,'$'),2,'URL:') 
     767   tl_att=att_init("SIREN_url",cl_url) 
     768   CALL file_add_att(tl_fileout, tl_att) 
     769 
     770   ! add date of creation 
    587771   cl_date=date_print(date_now()) 
    588772   tl_att=att_init("Creation_date",cl_date) 
     
    631815 
    632816CONTAINS 
     817   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     818   FUNCTION create_bathy_matrix(td_var, td_coord, ld_rand) & 
     819         & RESULT (tf_var) 
    633820   !------------------------------------------------------------------- 
    634821   !> @brief 
     
    641828   !> Each subdomain is filled with the corresponding value of the matrix. 
    642829   !> 
     830   !> Optionaly, you could add a random value of 0.1% of maximum depth to each 
     831   !> points of the bathymetry 
     832   !> 
    643833   !> @author J.Paul 
    644834   !> @date November, 2013 - Initial Version 
     
    646836   !> @param[in] td_var    variable structure  
    647837   !> @param[in] td_coord  coordinate file structure 
     838   !> @param[in] ld_rand   add random value to bathymetry 
    648839   !> @return variable structure 
    649840   !------------------------------------------------------------------- 
    650    FUNCTION create_bathy_matrix(td_var, td_coord) 
     841 
    651842      IMPLICIT NONE 
     843 
    652844      ! Argument 
    653845      TYPE(TVAR), INTENT(IN) :: td_var 
    654846      TYPE(TMPP), INTENT(IN) :: td_coord 
     847      LOGICAL   , INTENT(IN) :: ld_rand 
    655848 
    656849      ! function 
    657       TYPE(TVAR) :: create_bathy_matrix 
     850      TYPE(TVAR)             :: tf_var 
    658851 
    659852      ! local variable 
    660853      INTEGER(i4)      , DIMENSION(2,2)                  :: il_xghost 
    661       INTEGER(i4)      , DIMENSION(3)                    :: il_dim 
    662       INTEGER(i4)      , DIMENSION(3)                    :: il_size 
    663       INTEGER(i4)      , DIMENSION(3)                    :: il_rest 
     854      INTEGER(i4)      , DIMENSION(2)                    :: il_dim 
     855      INTEGER(i4)      , DIMENSION(2)                    :: il_size 
     856      INTEGER(i4)      , DIMENSION(2)                    :: il_rest 
    664857 
    665858      INTEGER(i4)      , DIMENSION(:)      , ALLOCATABLE :: il_ishape 
    666859      INTEGER(i4)      , DIMENSION(:)      , ALLOCATABLE :: il_jshape 
    667       INTEGER(i4)      , DIMENSION(:)      , ALLOCATABLE :: il_kshape 
    668  
     860 
     861      REAL(dp)         , DIMENSION(:,:)    , ALLOCATABLE :: dl_ran 
    669862      REAL(dp)         , DIMENSION(:,:,:,:), ALLOCATABLE :: dl_value 
    670863 
     
    677870      INTEGER(i4) :: ji 
    678871      INTEGER(i4) :: jj 
    679       INTEGER(i4) :: jk 
    680872      !---------------------------------------------------------------- 
    681873 
     
    705897      ! write value on grid 
    706898      ! get matrix dimension 
    707       il_dim(:)=td_var%t_dim(1:3)%i_len 
     899      il_dim(:)=td_var%t_dim(1:2)%i_len 
    708900      ! output dimension 
    709901      tl_dim(:)=dim_copy(tl_lon%t_dim(:)) 
     
    712904 
    713905      ! split output domain in N subdomain depending of matrix dimension  
    714       il_size(:) = tl_dim(1:3)%i_len / il_dim(:) 
    715       il_rest(:) = MOD(tl_dim(1:3)%i_len, il_dim(:)) 
     906      il_size(:) = tl_dim(1:2)%i_len / il_dim(:) 
     907      il_rest(:) = MOD(tl_dim(1:2)%i_len, il_dim(:)) 
    716908 
    717909      ALLOCATE( il_ishape(il_dim(1)+1) ) 
     
    731923      il_jshape(il_dim(2)+1)=il_jshape(il_dim(2)+1)+il_rest(2) 
    732924 
    733       ALLOCATE( il_kshape(il_dim(3)+1) ) 
    734       il_kshape(:)=0 
    735       DO jk=2,il_dim(3)+1 
    736          il_kshape(jk)=il_kshape(jk-1)+il_size(3) 
    737       ENDDO 
    738       ! add rest to last cell 
    739       il_kshape(il_dim(3)+1)=il_kshape(il_dim(3)+1)+il_rest(3) 
    740  
    741925      ! write ouput array of value  
    742926      ALLOCATE(dl_value( tl_dim(1)%i_len, & 
     
    746930 
    747931      dl_value(:,:,:,:)=0 
    748  
    749       DO jk=2,il_dim(3)+1 
    750          DO jj=2,il_dim(2)+1 
    751             DO ji=2,il_dim(1)+1 
    752                 
    753                dl_value( 1+il_ishape(ji-1):il_ishape(ji), & 
    754                &         1+il_jshape(jj-1):il_jshape(jj), & 
    755                &         1+il_kshape(jk-1):il_kshape(jk), & 
    756                &         1 ) = td_var%d_value(ji-1,jj-1,jk-1,1) 
    757  
    758             ENDDO 
     932      DO jj=2,il_dim(2)+1 
     933         DO ji=2,il_dim(1)+1 
     934             
     935            dl_value( 1+il_ishape(ji-1):il_ishape(ji), & 
     936            &         1+il_jshape(jj-1):il_jshape(jj), & 
     937            &         1,1 ) = td_var%d_value(ji-1,jj-1,1,1) 
     938 
    759939         ENDDO 
    760940      ENDDO 
    761941 
     942 
     943      IF( ld_rand )THEN 
     944         ALLOCATE(dl_ran(tl_dim(1)%i_len, & 
     945         &               tl_dim(2)%i_len) ) 
     946       
     947         ! set random value between 0 and 1 
     948         CALL RANDOM_NUMBER(dl_ran(:,:)) 
     949         ! set random value between -0.5 and 0.5 
     950         dl_ran(:,:)=dl_ran(:,:)-0.5 
     951         ! set random value of 0.1% of maximum depth 
     952         dl_ran(:,:)=dl_ran(:,:)*1.e-4*MAXVAL(td_var%d_value(:,:,1,1)) 
     953 
     954         dl_value(:,:,1,1)=dl_value(:,:,1,1)+dl_ran(:,:) 
     955       
     956         DEALLOCATE(dl_ran) 
     957      ENDIF 
     958 
    762959      ! initialise variable with value 
    763       create_bathy_matrix=var_init(TRIM(td_var%c_name),dl_value(:,:,:,:)) 
     960      tf_var=var_init(TRIM(td_var%c_name),dl_value(:,:,:,:)) 
    764961 
    765962      DEALLOCATE(dl_value) 
    766963 
    767964      ! add ghost cell 
    768       CALL grid_add_ghost(create_bathy_matrix, il_xghost(:,:)) 
     965      CALL grid_add_ghost(tf_var, il_xghost(:,:)) 
    769966 
    770967      ! clean 
     
    772969 
    773970   END FUNCTION create_bathy_matrix 
     971   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     972   FUNCTION create_bathy_extract(td_var, td_mpp, td_coord) & 
     973         &  RESULT (tf_var) 
    774974   !------------------------------------------------------------------- 
    775975   !> @brief 
     
    785985   !> @return variable structure 
    786986   !------------------------------------------------------------------- 
    787    FUNCTION create_bathy_extract(td_var, td_mpp, & 
    788    &                             td_coord) 
     987 
    789988      IMPLICIT NONE 
     989 
    790990      ! Argument 
    791991      TYPE(TVAR), INTENT(IN) :: td_var   
     
    794994 
    795995      ! function 
    796       TYPE(TVAR) :: create_bathy_extract 
     996      TYPE(TVAR)             :: tf_var 
    797997 
    798998      ! local variable 
     
    8081008      TYPE(TATT)  :: tl_att 
    8091009 
    810       TYPE(TVAR)  :: tl_var 
    811        
    8121010      TYPE(TDOM)  :: tl_dom 
    8131011      ! loop indices 
     
    8431041 
    8441042         ! read variable on domain 
    845          tl_var=iom_dom_read_var(tl_mpp,TRIM(td_var%c_name),tl_dom) 
     1043         tf_var=iom_dom_read_var(tl_mpp,TRIM(td_var%c_name),tl_dom) 
    8461044 
    8471045         ! close mpp file 
     
    8491047 
    8501048         ! add ghost cell 
    851          CALL grid_add_ghost(tl_var,tl_dom%i_ghost(:,:)) 
     1049         CALL grid_add_ghost(tf_var,tl_dom%i_ghost(:,:)) 
    8521050 
    8531051         ! check result 
    854          IF( ANY( tl_var%t_dim(:)%l_use .AND. & 
    855          &        tl_var%t_dim(:)%i_len /= td_coord%t_dim(:)%i_len) )THEN 
     1052         IF( ANY( tf_var%t_dim(:)%l_use .AND. & 
     1053         &        tf_var%t_dim(:)%i_len /= td_coord%t_dim(:)%i_len) )THEN 
    8561054            CALL logger_debug("CREATE BATHY EXTRACT: "//& 
    8571055            &        "dimensoin of variable "//TRIM(td_var%c_name)//" "//& 
    858             &        TRIM(fct_str(tl_var%t_dim(1)%i_len))//","//& 
    859             &        TRIM(fct_str(tl_var%t_dim(2)%i_len))//","//& 
    860             &        TRIM(fct_str(tl_var%t_dim(3)%i_len))//","//& 
    861             &        TRIM(fct_str(tl_var%t_dim(4)%i_len)) ) 
     1056            &        TRIM(fct_str(tf_var%t_dim(1)%i_len))//","//& 
     1057            &        TRIM(fct_str(tf_var%t_dim(2)%i_len))//","//& 
     1058            &        TRIM(fct_str(tf_var%t_dim(3)%i_len))//","//& 
     1059            &        TRIM(fct_str(tf_var%t_dim(4)%i_len)) ) 
    8621060            CALL logger_debug("CREATE BATHY EXTRACT: "//& 
    8631061            &        "dimensoin of coordinate file "//& 
     
    8731071         ! add attribute to variable 
    8741072         tl_att=att_init('src_file',TRIM(fct_basename(tl_mpp%c_name))) 
    875          CALL var_move_att(tl_var, tl_att)          
     1073         CALL var_move_att(tf_var, tl_att)          
    8761074 
    8771075         tl_att=att_init('src_i_indices',(/tl_dom%i_imin, tl_dom%i_imax/)) 
    878          CALL var_move_att(tl_var, tl_att) 
     1076         CALL var_move_att(tf_var, tl_att) 
    8791077 
    8801078         tl_att=att_init('src_j_indices',(/tl_dom%i_jmin, tl_dom%i_jmax/)) 
    881          CALL var_move_att(tl_var, tl_att) 
    882  
    883          ! save result 
    884          create_bathy_extract=var_copy(tl_var) 
     1079         CALL var_move_att(tf_var, tl_att) 
    8851080 
    8861081         ! clean structure 
    8871082         CALL att_clean(tl_att) 
    888          CALL var_clean(tl_var) 
    8891083         CALL mpp_clean(tl_mpp) 
    8901084      ENDIF 
    8911085 
    8921086   END FUNCTION create_bathy_extract 
     1087   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1088   FUNCTION create_bathy_get_var(td_var, td_mpp,   & 
     1089         &                       id_imin, id_jmin, & 
     1090         &                       id_imax, id_jmax, & 
     1091         &                       id_offset,        & 
     1092         &                       id_rho) & 
     1093         &  RESULT (tf_var) 
    8931094   !------------------------------------------------------------------- 
    8941095   !> @brief 
     
    9091110   !> @return variable structure 
    9101111   !------------------------------------------------------------------- 
    911    FUNCTION create_bathy_get_var(td_var, td_mpp,   & 
    912             &                    id_imin, id_jmin, & 
    913             &                    id_imax, id_jmax, & 
    914             &                    id_offset,        & 
    915             &                    id_rho ) 
     1112 
    9161113      IMPLICIT NONE 
     1114 
    9171115      ! Argument 
    9181116      TYPE(TVAR)                 , INTENT(IN) :: td_var   
     
    9261124 
    9271125      ! function 
    928       TYPE(TVAR) :: create_bathy_get_var 
     1126      TYPE(TVAR)                              :: tf_var 
    9291127 
    9301128      ! local variable 
    9311129      TYPE(TMPP)  :: tl_mpp 
    9321130      TYPE(TATT)  :: tl_att 
    933       TYPE(TVAR)  :: tl_var 
    9341131      TYPE(TDOM)  :: tl_dom 
    9351132 
     
    9591156 
    9601157      !- read variable value on domain 
    961       tl_var=iom_dom_read_var(tl_mpp,TRIM(td_var%c_name),tl_dom) 
     1158      tf_var=iom_dom_read_var(tl_mpp,TRIM(td_var%c_name),tl_dom) 
    9621159 
    9631160      !- close mpp files 
     
    9691166       
    9701167      !- interpolate variable 
    971       CALL create_bathy_interp(tl_var, il_rho(:), id_offset(:,:)) 
     1168      CALL create_bathy_interp(tf_var, il_rho(:), id_offset(:,:)) 
    9721169 
    9731170      !- remove extraband added to domain 
    974       CALL dom_del_extra( tl_var, tl_dom, il_rho(:) ) 
     1171      CALL dom_del_extra( tf_var, tl_dom, il_rho(:) ) 
    9751172 
    9761173      CALL dom_clean_extra( tl_dom ) 
    9771174 
    9781175      !- add ghost cell 
    979       CALL grid_add_ghost(tl_var,tl_dom%i_ghost(:,:)) 
     1176      CALL grid_add_ghost(tf_var,tl_dom%i_ghost(:,:)) 
    9801177  
    9811178      !- add attribute to variable 
    9821179      tl_att=att_init('src_file',TRIM(fct_basename(tl_mpp%c_name))) 
    983       CALL var_move_att(tl_var, tl_att) 
     1180      CALL var_move_att(tf_var, tl_att) 
    9841181 
    9851182      tl_att=att_init('src_i_indices',(/tl_dom%i_imin, tl_dom%i_imax/)) 
    986       CALL var_move_att(tl_var, tl_att) 
     1183      CALL var_move_att(tf_var, tl_att) 
    9871184 
    9881185      tl_att=att_init('src_j_indices',(/tl_dom%i_jmin, tl_dom%i_jmax/)) 
    989       CALL var_move_att(tl_var, tl_att) 
     1186      CALL var_move_att(tf_var, tl_att) 
    9901187 
    9911188      IF( .NOT. ALL(id_rho(:)==1) )THEN 
    9921189         tl_att=att_init("refinment_factor",(/id_rho(jp_I),id_rho(jp_J)/)) 
    993          CALL var_move_att(tl_var, tl_att) 
     1190         CALL var_move_att(tf_var, tl_att) 
    9941191      ENDIF 
    9951192 
    9961193      DEALLOCATE( il_rho ) 
    997  
    998       !- save result 
    999       create_bathy_get_var=var_copy(tl_var) 
    10001194 
    10011195      !- clean structure 
    10021196      CALL att_clean(tl_att) 
    1003       CALL var_clean(tl_var) 
    10041197      CALL mpp_clean(tl_mpp) 
    10051198  
    10061199   END FUNCTION create_bathy_get_var 
     1200   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1201   SUBROUTINE create_bathy_interp(td_var, id_rho, id_offset, & 
     1202         &                        id_iext, id_jext) 
    10071203   !------------------------------------------------------------------- 
    10081204   !> @brief 
     
    10181214   !> @param[in] id_jext   j-direction size of extra bands (default=im_minext) 
    10191215   !------------------------------------------------------------------- 
    1020    SUBROUTINE create_bathy_interp( td_var,         & 
    1021    &                               id_rho,          & 
    1022    &                               id_offset,       & 
    1023    &                               id_iext, id_jext) 
    10241216 
    10251217      IMPLICIT NONE 
     
    11121304 
    11131305   END SUBROUTINE create_bathy_interp 
     1306   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1307   SUBROUTINE create_bathy_check_depth(td_mpp, td_depth) 
    11141308   !------------------------------------------------------------------- 
    11151309   !> @brief 
     
    11251319   !> @param[inout] td_depth  depth variable structure  
    11261320   !------------------------------------------------------------------- 
    1127    SUBROUTINE create_bathy_check_depth( td_mpp, td_depth ) 
    11281321 
    11291322      IMPLICIT NONE 
     
    11641357       
    11651358   END SUBROUTINE create_bathy_check_depth 
     1359   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     1360   SUBROUTINE create_bathy_check_time(td_mpp, td_time) 
    11661361   !------------------------------------------------------------------- 
    11671362   !> @brief 
     
    11771372   !> @param[inout] td_time  time variable structure  
    11781373   !------------------------------------------------------------------- 
    1179    SUBROUTINE create_bathy_check_time( td_mpp, td_time ) 
    11801374 
    11811375      IMPLICIT NONE 
     
    12201414       
    12211415   END SUBROUTINE create_bathy_check_time 
     1416   !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    12221417END PROGRAM create_bathy 
  • 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,  &