Changeset 1138


Ignore:
Timestamp:
05/18/17 17:40:03 (4 years ago)
Author:
yushan
Message:

test_remap back to work. No thread for now

Location:
XIOS/dev/branch_yushan_merged
Files:
27 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/branch_yushan_merged/Doxyfile

    r502 r1138  
    1 # Doxyfile 1.7.4 
     1# Doxyfile 1.8.10 
    22 
    33# This file describes the settings to be used by the documentation system 
    4 # doxygen (www.doxygen.org) for a project 
    5 # 
    6 # All text after a hash (#) is considered a comment and will be ignored 
     4# doxygen (www.doxygen.org) for a project. 
     5# 
     6# All text after a double hash (##) is considered a comment and is placed in 
     7# front of the TAG it is preceding. 
     8# 
     9# All text after a single hash (#) is considered a comment and will be ignored. 
    710# The format is: 
    8 #       TAG = value [value, ...] 
    9 # For lists items can also be appended using: 
    10 #       TAG += value [value, ...] 
    11 # Values that contain spaces should be placed between quotes (" ") 
     11# TAG = value [value, ...] 
     12# For lists, items can also be appended using: 
     13# TAG += value [value, ...] 
     14# Values that contain spaces should be placed between quotes (\" \"). 
    1215 
    1316#--------------------------------------------------------------------------- 
     
    1518#--------------------------------------------------------------------------- 
    1619 
    17 # This tag specifies the encoding used for all characters in the config file  
    18 # that follow. The default is UTF-8 which is also the encoding used for all  
    19 # text before the first occurrence of this tag. Doxygen uses libiconv (or the  
    20 # iconv built into libc) for the transcoding. See  
    21 # http://www.gnu.org/software/libiconv for the list of possible encodings. 
     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. 
     25# The default value is: UTF-8. 
    2226 
    2327DOXYFILE_ENCODING      = UTF-8 
    2428 
    25 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded  
    26 # by quotes) that should identify the project. 
     29# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by 
     30# double-quotes, unless you are using Doxywizard) that should identify the 
     31# project for which the documentation is generated. This name is used in the 
     32# title of most generated pages and in a few other places. 
     33# The default value is: My Project. 
    2734 
    2835PROJECT_NAME           = XIOS 
    2936 
    30 # The PROJECT_NUMBER tag can be used to enter a project or revision number.  
    31 # This could be handy for archiving the generated documentation or  
    32 # if some version control system is used. 
     37# The PROJECT_NUMBER tag can be used to enter a project or revision number. This 
     38# could be handy for archiving the generated documentation or if some version 
     39# control system is used. 
    3340 
    3441PROJECT_NUMBER         = 1.0 
    3542 
    36 # Using the PROJECT_BRIEF tag one can provide an optional one line description  
    37 # for a project that appears at the top of each page and should give viewer  
    38 # a quick idea about the purpose of the project. Keep the description short. 
     43# Using the PROJECT_BRIEF tag one can provide an optional one line description 
     44# for a project that appears at the top of each page and should give viewer a 
     45# quick idea about the purpose of the project. Keep the description short. 
    3946 
    4047PROJECT_BRIEF          = "Xml I/O Server" 
    4148 
    42 # With the PROJECT_LOGO tag one can specify an logo or icon that is  
    43 # included in the documentation. The maximum height of the logo should not  
    44 # exceed 55 pixels and the maximum width should not exceed 200 pixels.  
    45 # Doxygen will copy the logo to the output directory. 
    46  
    47 PROJECT_LOGO           =  
    48  
    49 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)  
    50 # base path where the generated documentation will be put.  
    51 # If a relative path is entered, it will be relative to the location  
    52 # where doxygen was started. If left blank the current directory will be used. 
     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. 
     53 
     54PROJECT_LOGO           = 
     55 
     56# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path 
     57# into which the generated documentation will be written. If a relative path is 
     58# entered, it will be relative to the location where doxygen was started. If 
     59# left blank the current directory will be used. 
    5360 
    5461OUTPUT_DIRECTORY       = ./doc 
    5562 
    56 # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create  
    57 # 4096 sub-directories (in 2 levels) under the output directory of each output  
    58 # format and will distribute the generated files over these directories.  
    59 # Enabling this option can be useful when feeding doxygen a huge amount of  
    60 # source files, where putting all generated files in the same directory would  
    61 # otherwise cause performance problems for the file system. 
     63# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- 
     64# directories (in 2 levels) under the output directory of each output format and 
     65# will distribute the generated files over these directories. Enabling this 
     66# option can be useful when feeding doxygen a huge amount of source files, where 
     67# putting all generated files in the same directory would otherwise causes 
     68# performance problems for the file system. 
     69# The default value is: NO. 
    6270 
    6371CREATE_SUBDIRS         = NO 
    6472 
    65 # The OUTPUT_LANGUAGE tag is used to specify the language in which all  
    66 # documentation generated by doxygen is written. Doxygen will use this  
    67 # information to generate all constant output in the proper language.  
    68 # The default language is English, other supported languages are:  
    69 # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,  
    70 # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,  
    71 # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English  
    72 # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,  
    73 # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,  
    74 # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. 
     73# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII 
     74# characters to appear in the names of generated files. If set to NO, non-ASCII 
     75# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode 
     76# U+3044. 
     77# The default value is: NO. 
     78 
     79ALLOW_UNICODE_NAMES    = NO 
     80 
     81# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
     82# documentation generated by doxygen is written. Doxygen will use this 
     83# information to generate all constant output in the proper language. 
     84# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, 
     85# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), 
     86# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, 
     87# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), 
     88# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, 
     89# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, 
     90# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, 
     91# Ukrainian and Vietnamese. 
     92# The default value is: English. 
    7593 
    7694OUTPUT_LANGUAGE        = French 
    7795 
    78 # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will  
    79 # include brief member descriptions after the members that are listed in  
    80 # the file and class documentation (similar to JavaDoc).  
    81 # Set to NO to disable this. 
     96# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member 
     97# descriptions after the members that are listed in the file and class 
     98# documentation (similar to Javadoc). Set to NO to disable this. 
     99# The default value is: YES. 
    82100 
    83101BRIEF_MEMBER_DESC      = YES 
    84102 
    85 # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend  
    86 # the brief description of a member or function before the detailed description.  
    87 # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the  
     103# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief 
     104# description of a member or function before the detailed description 
     105# 
     106# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
    88107# brief descriptions will be completely suppressed. 
     108# The default value is: YES. 
    89109 
    90110REPEAT_BRIEF           = YES 
    91111 
    92 # This tag implements a quasi-intelligent brief description abbreviator  
    93 # that is used to form the text in various listings. Each string  
    94 # in this list, if found as the leading text of the brief description, will be  
    95 # stripped from the text and the result after processing the whole list, is  
    96 # used as the annotated text. Otherwise, the brief description is used as-is.  
    97 # If left blank, the following values are used ("$name" is automatically  
    98 # replaced with the name of the entity): "The $name class" "The $name widget"  
    99 # "The $name file" "is" "provides" "specifies" "contains"  
    100 # "represents" "a" "an" "the" 
     112# This tag implements a quasi-intelligent brief description abbreviator that is 
     113# used to form the text in various listings. Each string in this list, if found 
     114# as the leading text of the brief description, will be stripped from the text 
     115# and the result, after processing the whole list, is used as the annotated 
     116# text. Otherwise, the brief description is used as-is. If left blank, the 
     117# following values are used ($name is automatically replaced with the name of 
     118# the entity):The $name class, The $name widget, The $name file, is, provides, 
     119# specifies, contains, represents, a, an and the. 
    101120 
    102121ABBREVIATE_BRIEF       = "The $name class" \ 
     
    112131                         the 
    113132 
    114 # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then  
    115 # Doxygen will generate a detailed section even if there is only a brief  
     133# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
     134# doxygen will generate a detailed section even if there is only a brief 
    116135# description. 
     136# The default value is: NO. 
    117137 
    118138ALWAYS_DETAILED_SEC    = NO 
    119139 
    120 # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all  
    121 # inherited members of a class in the documentation of that class as if those  
    122 # members were ordinary class members. Constructors, destructors and assignment  
     140# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
     141# inherited members of a class in the documentation of that class as if those 
     142# members were ordinary class members. Constructors, destructors and assignment 
    123143# operators of the base classes will not be shown. 
     144# The default value is: NO. 
    124145 
    125146INLINE_INHERITED_MEMB  = NO 
    126147 
    127 # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full  
    128 # path before files name in the file list and in the header files. If set  
    129 # to NO the shortest path that makes the file name unique will be used. 
     148# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path 
     149# before files name in the file list and in the header files. If set to NO the 
     150# shortest path that makes the file name unique will be used 
     151# The default value is: YES. 
    130152 
    131153FULL_PATH_NAMES        = YES 
    132154 
    133 # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag  
    134 # can be used to strip a user-defined part of the path. Stripping is  
    135 # only done if one of the specified strings matches the left-hand part of  
    136 # the path. The tag can be used to show relative paths in the file list.  
    137 # If left blank the directory from which doxygen is run is used as the  
    138 # path to strip. 
    139  
    140 STRIP_FROM_PATH        =  
    141  
    142 # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of  
    143 # the path mentioned in the documentation of a class, which tells  
    144 # the reader which header file to include in order to use a class.  
    145 # If left blank only the name of the header file containing the class  
    146 # definition is used. Otherwise one should specify the include paths that  
    147 # are normally passed to the compiler using the -I flag. 
    148  
    149 STRIP_FROM_INC_PATH    =  
    150  
    151 # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter  
    152 # (but less readable) file names. This can be useful if your file system  
    153 # doesn't support long names like on DOS, Mac, or CD-ROM. 
     155# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. 
     156# Stripping is only done if one of the specified strings matches the left-hand 
     157# part of the path. The tag can be used to show relative paths in the file list. 
     158# If left blank the directory from which doxygen is run is used as the path to 
     159# strip. 
     160# 
     161# Note that you can specify absolute paths here, but also relative paths, which 
     162# will be relative from the directory where doxygen is started. 
     163# This tag requires that the tag FULL_PATH_NAMES is set to YES. 
     164 
     165STRIP_FROM_PATH        = 
     166 
     167# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the 
     168# path mentioned in the documentation of a class, which tells the reader which 
     169# header file to include in order to use a class. If left blank only the name of 
     170# the header file containing the class definition is used. Otherwise one should 
     171# specify the list of include paths that are normally passed to the compiler 
     172# using the -I flag. 
     173 
     174STRIP_FROM_INC_PATH    = 
     175 
     176# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but 
     177# less readable) file names. This can be useful is your file systems doesn't 
     178# support long names like on DOS, Mac, or CD-ROM. 
     179# The default value is: NO. 
    154180 
    155181SHORT_NAMES            = NO 
    156182 
    157 # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen  
    158 # will interpret the first line (until the first dot) of a JavaDoc-style  
    159 # comment as the brief description. If set to NO, the JavaDoc  
    160 # comments will behave just like regular Qt-style comments  
    161 # (thus requiring an explicit @brief command for a brief description.) 
     183# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the 
     184# first line (until the first dot) of a Javadoc-style comment as the brief 
     185# description. If set to NO, the Javadoc-style will behave just like regular Qt- 
     186# style comments (thus requiring an explicit @brief command for a brief 
     187# description.) 
     188# The default value is: NO. 
    162189 
    163190JAVADOC_AUTOBRIEF      = NO 
    164191 
    165 # If the QT_AUTOBRIEF tag is set to YES then Doxygen will  
    166 # interpret the first line (until the first dot) of a Qt-style  
    167 # comment as the brief description. If set to NO, the comments  
    168 # will behave just like regular Qt-style comments (thus requiring  
    169 # an explicit \brief command for a brief description.) 
     192# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first 
     193# line (until the first dot) of a Qt-style comment as the brief description. If 
     194# set to NO, the Qt-style will behave just like regular Qt-style comments (thus 
     195# requiring an explicit \brief command for a brief description.) 
     196# The default value is: NO. 
    170197 
    171198QT_AUTOBRIEF           = YES 
    172199 
    173 # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen  
    174 # treat a multi-line C++ special comment block (i.e. a block of //! or ///  
    175 # comments) as a brief description. This used to be the default behaviour.  
    176 # The new default is to treat a multi-line C++ comment block as a detailed  
    177 # description. Set this tag to YES if you prefer the old behaviour instead. 
     200# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a 
     201# multi-line C++ special comment block (i.e. a block of //! or /// comments) as 
     202# a brief description. This used to be the default behavior. The new default is 
     203# to treat a multi-line C++ comment block as a detailed description. Set this 
     204# tag to YES if you prefer the old behavior instead. 
     205# 
     206# Note that setting this tag to YES also means that rational rose comments are 
     207# not recognized any more. 
     208# The default value is: NO. 
    178209 
    179210MULTILINE_CPP_IS_BRIEF = NO 
    180211 
    181 # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented  
    182 # member inherits the documentation from any documented member that it  
    183 # re-implements. 
     212# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the 
     213# documentation from any documented member that it re-implements. 
     214# The default value is: YES. 
    184215 
    185216INHERIT_DOCS           = YES 
    186217 
    187 # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce  
    188 # a new page for each member. If set to NO, the documentation of a member will  
    189 # be part of the file/class/namespace that contains it. 
     218# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new 
     219# page for each member. If set to NO, the documentation of a member will be part 
     220# of the file/class/namespace that contains it. 
     221# The default value is: NO. 
    190222 
    191223SEPARATE_MEMBER_PAGES  = NO 
    192224 
    193 # The TAB_SIZE tag can be used to set the number of spaces in a tab.  
    194 # Doxygen uses this value to replace tabs by spaces in code fragments. 
     225# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen 
     226# uses this value to replace tabs by spaces in code fragments. 
     227# Minimum value: 1, maximum value: 16, default value: 4. 
    195228 
    196229TAB_SIZE               = 8 
    197230 
    198 # This tag can be used to specify a number of aliases that acts  
    199 # as commands in the documentation. An alias has the form "name=value".  
    200 # For example adding "sideeffect=\par Side Effects:\n" will allow you to  
    201 # put the command \sideeffect (or @sideeffect) in the documentation, which  
    202 # will result in a user-defined paragraph with heading "Side Effects:".  
    203 # You can put \n's in the value part of an alias to insert newlines. 
    204  
    205 ALIASES                =  
    206  
    207 # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C  
    208 # sources only. Doxygen will then generate output that is more tailored for C.  
    209 # For instance, some of the names that are used will be different. The list  
    210 # of all members will be omitted, etc. 
     231# This tag can be used to specify a number of aliases that act as commands in 
     232# the documentation. An alias has the form: 
     233# name=value 
     234# For example adding 
     235# "sideeffect=@par Side Effects:\n" 
     236# will allow you to put the command \sideeffect (or @sideeffect) in the 
     237# documentation, which will result in a user-defined paragraph with heading 
     238# "Side Effects:". You can put \n's in the value part of an alias to insert 
     239# newlines. 
     240 
     241ALIASES                = 
     242 
     243# This tag can be used to specify a number of word-keyword mappings (TCL only). 
     244# A mapping has the form "name=value". For example adding "class=itcl::class" 
     245# will allow you to use the command class in the itcl::class meaning. 
     246 
     247TCL_SUBST              = 
     248 
     249# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources 
     250# only. Doxygen will then generate output that is more tailored for C. For 
     251# instance, some of the names that are used will be different. The list of all 
     252# members will be omitted, etc. 
     253# The default value is: NO. 
    211254 
    212255OPTIMIZE_OUTPUT_FOR_C  = NO 
    213256 
    214 # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java  
    215 # sources only. Doxygen will then generate output that is more tailored for  
    216 # Java. For instance, namespaces will be presented as packages, qualified  
    217 # scopes will look different, etc. 
     257# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or 
     258# Python sources only. Doxygen will then generate output that is more tailored 
     259# for that language. For instance, namespaces will be presented as packages, 
     260# qualified scopes will look different, etc. 
     261# The default value is: NO. 
    218262 
    219263OPTIMIZE_OUTPUT_JAVA   = NO 
    220264 
    221 # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran  
    222 # sources only. Doxygen will then generate output that is more tailored for  
    223 # Fortran. 
     265# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
     266# sources. Doxygen will then generate output that is tailored for Fortran. 
     267# The default value is: NO. 
    224268 
    225269OPTIMIZE_FOR_FORTRAN   = NO 
    226270 
    227 # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL  
    228 # sources. Doxygen will then generate output that is tailored for  
    229 # VHDL. 
     271# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
     272# sources. Doxygen will then generate output that is tailored for VHDL. 
     273# The default value is: NO. 
    230274 
    231275OPTIMIZE_OUTPUT_VHDL   = NO 
    232276 
    233 # Doxygen selects the parser to use depending on the extension of the files it  
    234 # parses. With this tag you can assign which parser to use for a given extension.  
    235 # Doxygen has a built-in mapping, but you can override or extend it using this  
    236 # tag. The format is ext=language, where ext is a file extension, and language  
    237 # is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,  
    238 # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make  
    239 # doxygen treat .inc files as Fortran files (default is PHP), and .f files as C  
    240 # (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions  
    241 # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. 
    242  
    243 EXTENSION_MAPPING      =  
    244  
    245 # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want  
    246 # to include (a tag file for) the STL sources as input, then you should  
    247 # set this tag to YES in order to let doxygen match functions declarations and  
    248 # definitions whose arguments contain STL classes (e.g. func(std::string); v.s.  
    249 # func(std::string) {}). This also makes the inheritance and collaboration  
     277# Doxygen selects the parser to use depending on the extension of the files it 
     278# parses. With this tag you can assign which parser to use for a given 
     279# extension. Doxygen has a built-in mapping, but you can override or extend it 
     280# using this tag. The format is ext=language, where ext is a file extension, and 
     281# language is one of the parsers supported by doxygen: IDL, Java, Javascript, 
     282# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: 
     283# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: 
     284# Fortran. In the later case the parser tries to guess whether the code is fixed 
     285# or free formatted code, this is the default for Fortran type files), VHDL. For 
     286# instance to make doxygen treat .inc files as Fortran files (default is PHP), 
     287# and .f files as C (default is Fortran), use: inc=Fortran f=C. 
     288# 
     289# Note: For files without extension you can use no_extension as a placeholder. 
     290# 
     291# Note that for custom extensions you also need to set FILE_PATTERNS otherwise 
     292# the files are not read by doxygen. 
     293 
     294EXTENSION_MAPPING      = 
     295 
     296# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments 
     297# according to the Markdown format, which allows for more readable 
     298# documentation. See http://daringfireball.net/projects/markdown/ for details. 
     299# The output of markdown processing is further processed by doxygen, so you can 
     300# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in 
     301# case of backward compatibilities issues. 
     302# The default value is: YES. 
     303 
     304MARKDOWN_SUPPORT       = YES 
     305 
     306# When enabled doxygen tries to link words that correspond to documented 
     307# classes, or namespaces to their corresponding documentation. Such a link can 
     308# be prevented in individual cases by putting a % sign in front of the word or 
     309# globally by setting AUTOLINK_SUPPORT to NO. 
     310# The default value is: YES. 
     311 
     312AUTOLINK_SUPPORT       = YES 
     313 
     314# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
     315# to include (a tag file for) the STL sources as input, then you should set this 
     316# tag to YES in order to let doxygen match functions declarations and 
     317# definitions whose arguments contain STL classes (e.g. func(std::string); 
     318# versus func(std::string) {}). This also make the inheritance and collaboration 
    250319# diagrams that involve STL classes more complete and accurate. 
     320# The default value is: NO. 
    251321 
    252322BUILTIN_STL_SUPPORT    = YES 
    253323 
    254 # If you use Microsoft's C++/CLI language, you should set this option to YES to  
     324# If you use Microsoft's C++/CLI language, you should set this option to YES to 
    255325# enable parsing support. 
     326# The default value is: NO. 
    256327 
    257328CPP_CLI_SUPPORT        = NO 
    258329 
    259 # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.  
    260 # Doxygen will parse them like normal C++ but will assume all classes use public  
    261 # instead of private inheritance when no explicit protection keyword is present. 
     330# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: 
     331# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen 
     332# will parse them like normal C++ but will assume all classes use public instead 
     333# of private inheritance when no explicit protection keyword is present. 
     334# The default value is: NO. 
    262335 
    263336SIP_SUPPORT            = NO 
    264337 
    265 # For Microsoft's IDL there are propget and propput attributes to indicate getter  
    266 # and setter methods for a property. Setting this option to YES (the default)  
    267 # will make doxygen replace the get and set methods by a property in the  
    268 # documentation. This will only work if the methods are indeed getting or  
    269 # setting a simple type. If this is not the case, or you want to show the  
    270 # methods anyway, you should set this option to NO. 
     338# For Microsoft's IDL there are propget and propput attributes to indicate 
     339# getter and setter methods for a property. Setting this option to YES will make 
     340# doxygen to replace the get and set methods by a property in the documentation. 
     341# This will only work if the methods are indeed getting or setting a simple 
     342# type. If this is not the case, or you want to show the methods anyway, you 
     343# should set this option to NO. 
     344# The default value is: YES. 
    271345 
    272346IDL_PROPERTY_SUPPORT   = YES 
    273347 
    274 # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC  
    275 # tag is set to YES, then doxygen will reuse the documentation of the first  
    276 # member in the group (if any) for the other members of the group. By default  
     348# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
     349# tag is set to YES then doxygen will reuse the documentation of the first 
     350# member in the group (if any) for the other members of the group. By default 
    277351# all members of a group must be documented explicitly. 
     352# The default value is: NO. 
    278353 
    279354DISTRIBUTE_GROUP_DOC   = NO 
    280355 
    281 # Set the SUBGROUPING tag to YES (the default) to allow class member groups of  
    282 # the same type (for instance a group of public functions) to be put as a  
    283 # subgroup of that type (e.g. under the Public Functions section). Set it to  
    284 # NO to prevent subgrouping. Alternatively, this can be done per class using  
    285 # the \nosubgrouping command. 
     356# If one adds a struct or class to a group and this option is enabled, then also 
     357# any nested class or struct is added to the same group. By default this option 
     358# is disabled and one has to add nested compounds explicitly via \ingroup. 
     359# The default value is: NO. 
     360 
     361GROUP_NESTED_COMPOUNDS = NO 
     362 
     363# Set the SUBGROUPING tag to YES to allow class member groups of the same type 
     364# (for instance a group of public functions) to be put as a subgroup of that 
     365# type (e.g. under the Public Functions section). Set it to NO to prevent 
     366# subgrouping. Alternatively, this can be done per class using the 
     367# \nosubgrouping command. 
     368# The default value is: YES. 
    286369 
    287370SUBGROUPING            = YES 
    288371 
    289 # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and  
    290 # unions are shown inside the group in which they are included (e.g. using  
    291 # @ingroup) instead of on a separate page (for HTML and Man pages) or  
    292 # section (for LaTeX and RTF). 
     372# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions 
     373# are shown inside the group in which they are included (e.g. using \ingroup) 
     374# instead of on a separate page (for HTML and Man pages) or section (for LaTeX 
     375# and RTF). 
     376# 
     377# Note that this feature does not work in combination with 
     378# SEPARATE_MEMBER_PAGES. 
     379# The default value is: NO. 
    293380 
    294381INLINE_GROUPED_CLASSES = NO 
    295382 
    296 # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum  
    297 # is documented as struct, union, or enum with the name of the typedef. So  
    298 # typedef struct TypeS {} TypeT, will appear in the documentation as a struct  
    299 # with name TypeT. When disabled the typedef will appear as a member of a file,  
    300 # namespace, or class. And the struct will be named TypeS. This can typically  
    301 # be useful for C code in case the coding convention dictates that all compound  
     383# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions 
     384# with only public data fields or simple typedef fields will be shown inline in 
     385# the documentation of the scope in which they are defined (i.e. file, 
     386# namespace, or group documentation), provided this scope is documented. If set 
     387# to NO, structs, classes, and unions are shown on a separate page (for HTML and 
     388# Man pages) or section (for LaTeX and RTF). 
     389# The default value is: NO. 
     390 
     391INLINE_SIMPLE_STRUCTS  = NO 
     392 
     393# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or 
     394# enum is documented as struct, union, or enum with the name of the typedef. So 
     395# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
     396# with name TypeT. When disabled the typedef will appear as a member of a file, 
     397# namespace, or class. And the struct will be named TypeS. This can typically be 
     398# useful for C code in case the coding convention dictates that all compound 
    302399# types are typedef'ed and only the typedef is referenced, never the tag name. 
     400# The default value is: NO. 
    303401 
    304402TYPEDEF_HIDES_STRUCT   = NO 
    305403 
    306 # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to  
    307 # determine which symbols to keep in memory and which to flush to disk.  
    308 # When the cache is full, less often used symbols will be written to disk.  
    309 # For small to medium size projects (<1000 input files) the default value is  
    310 # probably good enough. For larger projects a too small cache size can cause  
    311 # doxygen to be busy swapping symbols to and from disk most of the time  
    312 # causing a significant performance penalty.  
    313 # If the system has enough physical memory increasing the cache will improve the  
    314 # performance by keeping more symbols in memory. Note that the value works on  
    315 # a logarithmic scale so increasing the size by one will roughly double the  
    316 # memory usage. The cache size is given by this formula:  
    317 # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,  
    318 # corresponding to a cache size of 2^16 = 65536 symbols 
    319  
    320 SYMBOL_CACHE_SIZE      = 0 
     404# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This 
     405# cache is used to resolve symbols given their name and scope. Since this can be 
     406# an expensive process and often the same symbol appears multiple times in the 
     407# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small 
     408# doxygen will become slower. If the cache is too large, memory is wasted. The 
     409# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range 
     410# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 
     411# symbols. At the end of a run doxygen will report the cache usage and suggest 
     412# the optimal cache size from a speed point of view. 
     413# Minimum value: 0, maximum value: 9, default value: 0. 
     414 
     415LOOKUP_CACHE_SIZE      = 0 
    321416 
    322417#--------------------------------------------------------------------------- 
     
    324419#--------------------------------------------------------------------------- 
    325420 
    326 # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in  
    327 # documentation are documented, even if no documentation was available.  
    328 # Private class members and static file members will be hidden unless  
    329 # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES 
     421# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in 
     422# documentation are documented, even if no documentation was available. Private 
     423# class members and static file members will be hidden unless the 
     424# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. 
     425# Note: This will also disable the warnings about undocumented members that are 
     426# normally produced when WARNINGS is set to YES. 
     427# The default value is: NO. 
    330428 
    331429EXTRACT_ALL            = YES 
    332430 
    333 # If the EXTRACT_PRIVATE tag is set to YES all private members of a class  
    334 # will be included in the documentation. 
     431# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will 
     432# be included in the documentation. 
     433# The default value is: NO. 
    335434 
    336435EXTRACT_PRIVATE        = YES 
    337436 
    338 # If the EXTRACT_STATIC tag is set to YES all static members of a file  
    339 # will be included in the documentation. 
     437# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal 
     438# scope will be included in the documentation. 
     439# The default value is: NO. 
     440 
     441EXTRACT_PACKAGE        = NO 
     442 
     443# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be 
     444# included in the documentation. 
     445# The default value is: NO. 
    340446 
    341447EXTRACT_STATIC         = YES 
    342448 
    343 # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)  
    344 # defined locally in source files will be included in the documentation.  
    345 # If set to NO only classes defined in header files are included. 
     449# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined 
     450# locally in source files will be included in the documentation. If set to NO, 
     451# only classes defined in header files are included. Does not have any effect 
     452# for Java sources. 
     453# The default value is: YES. 
    346454 
    347455EXTRACT_LOCAL_CLASSES  = YES 
    348456 
    349 # This flag is only useful for Objective-C code. When set to YES local  
    350 # methods, which are defined in the implementation section but not in  
    351 # the interface are included in the documentation.  
    352 # If set to NO (the default) only methods in the interface are included. 
     457# This flag is only useful for Objective-C code. If set to YES, local methods, 
     458# which are defined in the implementation section but not in the interface are 
     459# included in the documentation. If set to NO, only methods in the interface are 
     460# included. 
     461# The default value is: NO. 
    353462 
    354463EXTRACT_LOCAL_METHODS  = YES 
    355464 
    356 # If this flag is set to YES, the members of anonymous namespaces will be  
    357 # extracted and appear in the documentation as a namespace called  
    358 # 'anonymous_namespace{file}', where file will be replaced with the base  
    359 # name of the file that contains the anonymous namespace. By default  
    360 # anonymous namespaces are hidden. 
     465# If this flag is set to YES, the members of anonymous namespaces will be 
     466# extracted and appear in the documentation as a namespace called 
     467# 'anonymous_namespace{file}', where file will be replaced with the base name of 
     468# the file that contains the anonymous namespace. By default anonymous namespace 
     469# are hidden. 
     470# The default value is: NO. 
    361471 
    362472EXTRACT_ANON_NSPACES   = NO 
    363473 
    364 # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all  
    365 # undocumented members of documented classes, files or namespaces.  
    366 # If set to NO (the default) these members will be included in the  
    367 # various overviews, but no documentation section is generated.  
    368 # This option has no effect if EXTRACT_ALL is enabled. 
     474# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all 
     475# undocumented members inside documented classes or files. If set to NO these 
     476# members will be included in the various overviews, but no documentation 
     477# section is generated. This option has no effect if EXTRACT_ALL is enabled. 
     478# The default value is: NO. 
    369479 
    370480HIDE_UNDOC_MEMBERS     = NO 
    371481 
    372 # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all  
    373 # undocumented classes that are normally visible in the class hierarchy.  
    374 # If set to NO (the default) these classes will be included in the various  
    375 # overviews. This option has no effect if EXTRACT_ALL is enabled. 
     482# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all 
     483# undocumented classes that are normally visible in the class hierarchy. If set 
     484# to NO, these classes will be included in the various overviews. This option 
     485# has no effect if EXTRACT_ALL is enabled. 
     486# The default value is: NO. 
    376487 
    377488HIDE_UNDOC_CLASSES     = NO 
    378489 
    379 # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all  
    380 # friend (class|struct|union) declarations.  
    381 # If set to NO (the default) these declarations will be included in the  
    382 # documentation. 
     490# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend 
     491# (class|struct|union) declarations. If set to NO, these declarations will be 
     492# included in the documentation. 
     493# The default value is: NO. 
    383494 
    384495HIDE_FRIEND_COMPOUNDS  = NO 
    385496 
    386 # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any  
    387 # documentation blocks found inside the body of a function.  
    388 # If set to NO (the default) these blocks will be appended to the  
    389 # function's detailed documentation block. 
     497# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any 
     498# documentation blocks found inside the body of a function. If set to NO, these 
     499# blocks will be appended to the function's detailed documentation block. 
     500# The default value is: NO. 
    390501 
    391502HIDE_IN_BODY_DOCS      = NO 
    392503 
    393 # The INTERNAL_DOCS tag determines if documentation  
    394 # that is typed after a \internal command is included. If the tag is set  
    395 # to NO (the default) then the documentation will be excluded.  
    396 # Set it to YES to include the internal documentation. 
     504# The INTERNAL_DOCS tag determines if documentation that is typed after a 
     505# \internal command is included. If the tag is set to NO then the documentation 
     506# will be excluded. Set it to YES to include the internal documentation. 
     507# The default value is: NO. 
    397508 
    398509INTERNAL_DOCS          = NO 
    399510 
    400 # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate  
    401 # file names in lower-case letters. If set to YES upper-case letters are also  
    402 # allowed. This is useful if you have classes or files whose names only differ  
    403 # in case and if your file system supports case sensitive file names. Windows  
     511# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file 
     512# names in lower-case letters. If set to YES, upper-case letters are also 
     513# allowed. This is useful if you have classes or files whose names only differ 
     514# in case and if your file system supports case sensitive file names. Windows 
    404515# and Mac users are advised to set this option to NO. 
     516# The default value is: system dependent. 
    405517 
    406518CASE_SENSE_NAMES       = NO 
    407519 
    408 # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen  
    409 # will show members with their full class and namespace scopes in the  
    410 # documentation. If set to YES the scope will be hidden. 
     520# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with 
     521# their full class and namespace scopes in the documentation. If set to YES, the 
     522# scope will be hidden. 
     523# The default value is: NO. 
    411524 
    412525HIDE_SCOPE_NAMES       = NO 
    413526 
    414 # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen  
    415 # will put a list of the files that are included by a file in the documentation  
    416 # of that file. 
     527# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will 
     528# append additional text to a page's title, such as Class Reference. If set to 
     529# YES the compound reference will be hidden. 
     530# The default value is: NO. 
     531 
     532HIDE_COMPOUND_REFERENCE= NO 
     533 
     534# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of 
     535# the files that are included by a file in the documentation of that file. 
     536# The default value is: YES. 
    417537 
    418538SHOW_INCLUDE_FILES     = YES 
    419539 
    420 # If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen  
    421 # will list include files with double quotes in the documentation  
    422 # rather than with sharp brackets. 
     540# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each 
     541# grouped member an include statement to the documentation, telling the reader 
     542# which file to include in order to use the member. 
     543# The default value is: NO. 
     544 
     545SHOW_GROUPED_MEMB_INC  = NO 
     546 
     547# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include 
     548# files with double quotes in the documentation rather than with sharp brackets. 
     549# The default value is: NO. 
    423550 
    424551FORCE_LOCAL_INCLUDES   = NO 
    425552 
    426 # If the INLINE_INFO tag is set to YES (the default) then a tag [inline]  
    427 # is inserted in the documentation for inline members. 
     553# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the 
     554# documentation for inline members. 
     555# The default value is: YES. 
    428556 
    429557INLINE_INFO            = YES 
    430558 
    431 # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen  
    432 # will sort the (detailed) documentation of file and class members  
    433 # alphabetically by member name. If set to NO the members will appear in  
    434 # declaration order. 
     559# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the 
     560# (detailed) documentation of file and class members alphabetically by member 
     561# name. If set to NO, the members will appear in declaration order. 
     562# The default value is: YES. 
    435563 
    436564SORT_MEMBER_DOCS       = YES 
    437565 
    438 # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the  
    439 # brief documentation of file, namespace and class members alphabetically  
    440 # by member name. If set to NO (the default) the members will appear in  
    441 # declaration order. 
     566# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief 
     567# descriptions of file, namespace and class members alphabetically by member 
     568# name. If set to NO, the members will appear in declaration order. Note that 
     569# this will also influence the order of the classes in the class list. 
     570# The default value is: NO. 
    442571 
    443572SORT_BRIEF_DOCS        = NO 
    444573 
    445 # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen  
    446 # will sort the (brief and detailed) documentation of class members so that  
    447 # constructors and destructors are listed first. If set to NO (the default)  
    448 # the constructors will appear in the respective orders defined by  
    449 # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.  
    450 # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO  
    451 # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. 
     574# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the 
     575# (brief and detailed) documentation of class members so that constructors and 
     576# destructors are listed first. If set to NO the constructors will appear in the 
     577# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. 
     578# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief 
     579# member documentation. 
     580# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting 
     581# detailed member documentation. 
     582# The default value is: NO. 
    452583 
    453584SORT_MEMBERS_CTORS_1ST = NO 
    454585 
    455 # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the  
    456 # hierarchy of group names into alphabetical order. If set to NO (the default)  
    457 # the group names will appear in their defined order. 
     586# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy 
     587# of group names into alphabetical order. If set to NO the group names will 
     588# appear in their defined order. 
     589# The default value is: NO. 
    458590 
    459591SORT_GROUP_NAMES       = NO 
    460592 
    461 # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be  
    462 # sorted by fully-qualified names, including namespaces. If set to  
    463 # NO (the default), the class list will be sorted only by class name,  
    464 # not including the namespace part.  
    465 # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.  
    466 # Note: This option applies only to the class list, not to the  
    467 # alphabetical list. 
     593# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by 
     594# fully-qualified names, including namespaces. If set to NO, the class list will 
     595# be sorted only by class name, not including the namespace part. 
     596# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
     597# Note: This option applies only to the class list, not to the alphabetical 
     598# list. 
     599# The default value is: NO. 
    468600 
    469601SORT_BY_SCOPE_NAME     = NO 
    470602 
    471 # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to  
    472 # do proper type resolution of all parameters of a function it will reject a  
    473 # match between the prototype and the implementation of a member function even  
    474 # if there is only one candidate or it is obvious which candidate to choose  
    475 # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen  
    476 # will still accept a match between prototype and implementation in such cases. 
     603# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper 
     604# type resolution of all parameters of a function it will reject a match between 
     605# the prototype and the implementation of a member function even if there is 
     606# only one candidate or it is obvious which candidate to choose by doing a 
     607# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still 
     608# accept a match between prototype and implementation in such cases. 
     609# The default value is: NO. 
    477610 
    478611STRICT_PROTO_MATCHING  = NO 
    479612 
    480 # The GENERATE_TODOLIST tag can be used to enable (YES) or  
    481 # disable (NO) the todo list. This list is created by putting \todo  
    482 # commands in the documentation. 
     613# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo 
     614# list. This list is created by putting \todo commands in the documentation. 
     615# The default value is: YES. 
    483616 
    484617GENERATE_TODOLIST      = YES 
    485618 
    486 # The GENERATE_TESTLIST tag can be used to enable (YES) or  
    487 # disable (NO) the test list. This list is created by putting \test  
    488 # commands in the documentation. 
     619# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test 
     620# list. This list is created by putting \test commands in the documentation. 
     621# The default value is: YES. 
    489622 
    490623GENERATE_TESTLIST      = YES 
    491624 
    492 # The GENERATE_BUGLIST tag can be used to enable (YES) or  
    493 # disable (NO) the bug list. This list is created by putting \bug  
    494 # commands in the documentation. 
     625# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug 
     626# list. This list is created by putting \bug commands in the documentation. 
     627# The default value is: YES. 
    495628 
    496629GENERATE_BUGLIST       = YES 
    497630 
    498 # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or  
    499 # disable (NO) the deprecated list. This list is created by putting  
    500 # \deprecated commands in the documentation. 
     631# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) 
     632# the deprecated list. This list is created by putting \deprecated commands in 
     633# the documentation. 
     634# The default value is: YES. 
    501635 
    502636GENERATE_DEPRECATEDLIST= YES 
    503637 
    504 # The ENABLED_SECTIONS tag can be used to enable conditional  
    505 # documentation sections, marked by \if sectionname ... \endif. 
    506  
    507 ENABLED_SECTIONS       =  
    508  
    509 # The MAX_INITIALIZER_LINES tag determines the maximum number of lines  
    510 # the initial value of a variable or macro consists of for it to appear in  
    511 # the documentation. If the initializer consists of more lines than specified  
    512 # here it will be hidden. Use a value of 0 to hide initializers completely.  
    513 # The appearance of the initializer of individual variables and macros in the  
    514 # documentation can be controlled using \showinitializer or \hideinitializer  
    515 # command in the documentation regardless of this setting. 
     638# The ENABLED_SECTIONS tag can be used to enable conditional documentation 
     639# sections, marked by \if <section_label> ... \endif and \cond <section_label> 
     640# ... \endcond blocks. 
     641 
     642ENABLED_SECTIONS       = 
     643 
     644# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the 
     645# initial value of a variable or macro / define can have for it to appear in the 
     646# documentation. If the initializer consists of more lines than specified here 
     647# it will be hidden. Use a value of 0 to hide initializers completely. The 
     648# appearance of the value of individual variables and macros / defines can be 
     649# controlled using \showinitializer or \hideinitializer command in the 
     650# documentation regardless of this setting. 
     651# Minimum value: 0, maximum value: 10000, default value: 30. 
    516652 
    517653MAX_INITIALIZER_LINES  = 30 
    518654 
    519 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated  
    520 # at the bottom of the documentation of classes and structs. If set to YES the  
     655# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at 
     656# the bottom of the documentation of classes and structs. If set to YES, the 
    521657# list will mention the files that were used to generate the documentation. 
     658# The default value is: YES. 
    522659 
    523660SHOW_USED_FILES        = YES 
    524661 
    525 # If the sources in your project are distributed over multiple directories  
    526 # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy  
    527 # in the documentation. The default is NO. 
    528  
    529 SHOW_DIRECTORIES       = YES 
    530  
    531 # Set the SHOW_FILES tag to NO to disable the generation of the Files page.  
    532 # This will remove the Files entry from the Quick Index and from the  
    533 # Folder Tree View (if specified). The default is YES. 
     662# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This 
     663# will remove the Files entry from the Quick Index and from the Folder Tree View 
     664# (if specified). 
     665# The default value is: YES. 
    534666 
    535667SHOW_FILES             = YES 
    536668 
    537 # Set the SHOW_NAMESPACES tag to NO to disable the generation of the  
    538 # Namespaces page.  This will remove the Namespaces entry from the Quick Index  
    539 # and from the Folder Tree View (if specified). The default is YES. 
     669# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces 
     670# page. This will remove the Namespaces entry from the Quick Index and from the 
     671# Folder Tree View (if specified). 
     672# The default value is: YES. 
    540673 
    541674SHOW_NAMESPACES        = YES 
    542675 
    543 # The FILE_VERSION_FILTER tag can be used to specify a program or script that  
    544 # doxygen should invoke to get the current version for each file (typically from  
    545 # the version control system). Doxygen will invoke the program by executing (via  
    546 # popen()) the command <command> <input-file>, where <command> is the value of  
    547 # the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file  
    548 # provided by doxygen. Whatever the program writes to standard output  
    549 # is used as the file version. See the manual for examples. 
    550  
    551 FILE_VERSION_FILTER    =  
    552  
    553 # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed  
    554 # by doxygen. The layout file controls the global structure of the generated  
    555 # output files in an output format independent way. The create the layout file  
    556 # that represents doxygen's defaults, run doxygen with the -l option.  
    557 # You can optionally specify a file name after the option, if omitted  
    558 # DoxygenLayout.xml will be used as the name of the layout file. 
    559  
    560 LAYOUT_FILE            =  
    561  
    562 #--------------------------------------------------------------------------- 
    563 # configuration options related to warning and progress messages 
    564 #--------------------------------------------------------------------------- 
    565  
    566 # The QUIET tag can be used to turn on/off the messages that are generated  
    567 # by doxygen. Possible values are YES and NO. If left blank NO is used. 
     676# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
     677# doxygen should invoke to get the current version for each file (typically from 
     678# the version control system). Doxygen will invoke the program by executing (via 
     679# popen()) the command command input-file, where command is the value of the 
     680# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided 
     681# by doxygen. Whatever the program writes to standard output is used as the file 
     682# version. For an example see the documentation. 
     683 
     684FILE_VERSION_FILTER    = 
     685 
     686# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed 
     687# by doxygen. The layout file controls the global structure of the generated 
     688# output files in an output format independent way. To create the layout file 
     689# that represents doxygen's defaults, run doxygen with the -l option. You can 
     690# optionally specify a file name after the option, if omitted DoxygenLayout.xml 
     691# will be used as the name of the layout file. 
     692# 
     693# Note that if you run doxygen from a directory containing a file called 
     694# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE 
     695# tag is left empty. 
     696 
     697LAYOUT_FILE            = 
     698 
     699# The CITE_BIB_FILES tag can be used to specify one or more bib files containing 
     700# the reference definitions. This must be a list of .bib files. The .bib 
     701# extension is automatically appended if omitted. This requires the bibtex tool 
     702# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. 
     703# For LaTeX the style of the bibliography can be controlled using 
     704# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the 
     705# search path. See also \cite for info how to create references. 
     706 
     707CITE_BIB_FILES         = 
     708 
     709#--------------------------------------------------------------------------- 
     710# Configuration options related to warning and progress messages 
     711#--------------------------------------------------------------------------- 
     712 
     713# The QUIET tag can be used to turn on/off the messages that are generated to 
     714# standard output by doxygen. If QUIET is set to YES this implies that the 
     715# messages are off. 
     716# The default value is: NO. 
    568717 
    569718QUIET                  = NO 
    570719 
    571 # The WARNINGS tag can be used to turn on/off the warning messages that are  
    572 # generated by doxygen. Possible values are YES and NO. If left blank  
    573 # NO is used. 
     720# The WARNINGS tag can be used to turn on/off the warning messages that are 
     721# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES 
     722# this implies that the warnings are on. 
     723# 
     724# Tip: Turn warnings on while writing the documentation. 
     725# The default value is: YES. 
    574726 
    575727WARNINGS               = YES 
    576728 
    577 # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings  
    578 # for undocumented members. If EXTRACT_ALL is set to YES then this flag will  
    579 # automatically be disabled. 
     729# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate 
     730# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag 
     731# will automatically be disabled. 
     732# The default value is: YES. 
    580733 
    581734WARN_IF_UNDOCUMENTED   = YES 
    582735 
    583 # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for  
    584 # potential errors in the documentation, such as not documenting some  
    585 # parameters in a documented function, or documenting parameters that  
    586 # don't exist or using markup commands wrongly. 
     736# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for 
     737# potential errors in the documentation, such as not documenting some parameters 
     738# in a documented function, or documenting parameters that don't exist or using 
     739# markup commands wrongly. 
     740# The default value is: YES. 
    587741 
    588742WARN_IF_DOC_ERROR      = YES 
    589743 
    590 # The WARN_NO_PARAMDOC option can be enabled to get warnings for  
    591 # functions that are documented, but have no documentation for their parameters  
    592 # or return value. If set to NO (the default) doxygen will only warn about  
    593 # wrong or incomplete parameter documentation, but not about the absence of  
    594 # documentation. 
     744# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that 
     745# are documented, but have no documentation for their parameters or return 
     746# value. If set to NO, doxygen will only warn about wrong or incomplete 
     747# parameter documentation, but not about the absence of documentation. 
     748# The default value is: NO. 
    595749 
    596750WARN_NO_PARAMDOC       = YES 
    597751 
    598 # The WARN_FORMAT tag determines the format of the warning messages that  
    599 # doxygen can produce. The string should contain the $file, $line, and $text  
    600 # tags, which will be replaced by the file and line number from which the  
    601 # warning originated and the warning text. Optionally the format may contain  
    602 # $version, which will be replaced by the version of the file (if it could  
    603 # be obtained via FILE_VERSION_FILTER) 
     752# The WARN_FORMAT tag determines the format of the warning messages that doxygen 
     753# can produce. The string should contain the $file, $line, and $text tags, which 
     754# will be replaced by the file and line number from which the warning originated 
     755# and the warning text. Optionally the format may contain $version, which will 
     756# be replaced by the version of the file (if it could be obtained via 
     757# FILE_VERSION_FILTER) 
     758# The default value is: $file:$line: $text. 
    604759 
    605760WARN_FORMAT            = "$file:$line: $text" 
    606761 
    607 # The WARN_LOGFILE tag can be used to specify a file to which warning  
    608 # and error messages should be written. If left blank the output is written  
    609 # to stderr. 
    610  
    611 WARN_LOGFILE           =  
    612  
    613 #--------------------------------------------------------------------------- 
    614 # configuration options related to the input files 
    615 #--------------------------------------------------------------------------- 
    616  
    617 # The INPUT tag can be used to specify the files and/or directories that contain  
    618 # documented source files. You may enter file names like "myfile.cpp" or  
    619 # directories like "/usr/src/myproject". Separate the files or directories  
    620 # with spaces. 
     762# The WARN_LOGFILE tag can be used to specify a file to which warning and error 
     763# messages should be written. If left blank the output is written to standard 
     764# error (stderr). 
     765 
     766WARN_LOGFILE           = 
     767 
     768#--------------------------------------------------------------------------- 
     769# Configuration options related to the input files 
     770#--------------------------------------------------------------------------- 
     771 
     772# The INPUT tag is used to specify the files and/or directories that contain 
     773# documented source files. You may enter file names like myfile.cpp or 
     774# directories like /usr/src/myproject. Separate the files or directories with 
     775# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING 
     776# Note: If this tag is empty the current directory is searched. 
    621777 
    622778INPUT                  = src 
    623779 
    624 # This tag can be used to specify the character encoding of the source files  
    625 # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is  
    626 # also the default input encoding. Doxygen uses libiconv (or the iconv built  
    627 # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for  
    628 # the list of possible encodings. 
     780# This tag can be used to specify the character encoding of the source files 
     781# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses 
     782# libiconv (or the iconv built into libc) for the transcoding. See the libiconv 
     783# documentation (see: http://www.gnu.org/software/libiconv) for the list of 
     784# possible encodings. 
     785# The default value is: UTF-8. 
    629786 
    630787INPUT_ENCODING         = UTF-8 
    631788 
    632 # If the value of the INPUT tag contains directories, you can use the  
    633 # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp  
    634 # and *.h) to filter out the source-files in the directories. If left  
    635 # blank the following patterns are tested:  
    636 # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh  
    637 # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py  
    638 # *.f90 *.f *.for *.vhd *.vhdl 
     789# If the value of the INPUT tag contains directories, you can use the 
     790# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and 
     791# *.h) to filter out the source-files in the directories. 
     792# 
     793# Note that for custom extensions or not directly supported extensions you also 
     794# need to set EXTENSION_MAPPING for the extension otherwise the files are not 
     795# read by doxygen. 
     796# 
     797# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, 
     798# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, 
     799# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, 
     800# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, 
     801# *.vhdl, *.ucf, *.qsf, *.as and *.js. 
    639802 
    640803FILE_PATTERNS          = *.cpp \ 
     
    642805                         *.conf 
    643806 
    644 # The RECURSIVE tag can be used to turn specify whether or not subdirectories  
    645 # should be searched for input files as well. Possible values are YES and NO.  
    646 # If left blank NO is used. 
     807# The RECURSIVE tag can be used to specify whether or not subdirectories should 
     808# be searched for input files as well. 
     809# The default value is: NO. 
    647810 
    648811RECURSIVE              = YES 
    649812 
    650 # The EXCLUDE tag can be used to specify files and/or directories that should  
    651 # excluded from the INPUT source files. This way you can easily exclude a  
     813# The EXCLUDE tag can be used to specify files and/or directories that should be 
     814# excluded from the INPUT source files. This way you can easily exclude a 
    652815# subdirectory from a directory tree whose root is specified with the INPUT tag. 
    653  
    654 EXCLUDE                =  
    655  
    656 # The EXCLUDE_SYMLINKS tag can be used select whether or not files or  
    657 # directories that are symbolic links (a Unix file system feature) are excluded  
     816# 
     817# Note that relative paths are relative to the directory from which doxygen is 
     818# run. 
     819 
     820EXCLUDE                = 
     821 
     822# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or 
     823# directories that are symbolic links (a Unix file system feature) are excluded 
    658824# from the input. 
     825# The default value is: NO. 
    659826 
    660827EXCLUDE_SYMLINKS       = NO 
    661828 
    662 # If the value of the INPUT tag contains directories, you can use the  
    663 # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude  
    664 # certain files from those directories. Note that the wildcards are matched  
    665 # against the file with absolute path, so to exclude all test directories  
    666 # for example use the pattern */test/* 
    667  
    668 EXCLUDE_PATTERNS       =  
    669  
    670 # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names  
    671 # (namespaces, classes, functions, etc.) that should be excluded from the  
    672 # output. The symbol name can be a fully qualified name, a word, or if the  
    673 # wildcard * is used, a substring. Examples: ANamespace, AClass,  
     829# If the value of the INPUT tag contains directories, you can use the 
     830# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
     831# certain files from those directories. 
     832# 
     833# Note that the wildcards are matched against the file with absolute path, so to 
     834# exclude all test directories for example use the pattern */test/* 
     835 
     836EXCLUDE_PATTERNS       = 
     837 
     838# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
     839# (namespaces, classes, functions, etc.) that should be excluded from the 
     840# output. The symbol name can be a fully qualified name, a word, or if the 
     841# wildcard * is used, a substring. Examples: ANamespace, AClass, 
    674842# AClass::ANamespace, ANamespace::*Test 
    675  
    676 EXCLUDE_SYMBOLS        =  
    677  
    678 # The EXAMPLE_PATH tag can be used to specify one or more files or  
    679 # directories that contain example code fragments that are included (see  
    680 # the \include command). 
    681  
    682 EXAMPLE_PATH           =  
    683  
    684 # If the value of the EXAMPLE_PATH tag contains directories, you can use the  
    685 # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp  
    686 # and *.h) to filter out the source-files in the directories. If left  
    687 # blank all files are included. 
     843# 
     844# Note that the wildcards are matched against the file with absolute path, so to 
     845# exclude all test directories use the pattern */test/* 
     846 
     847EXCLUDE_SYMBOLS        = 
     848 
     849# The EXAMPLE_PATH tag can be used to specify one or more files or directories 
     850# that contain example code fragments that are included (see the \include 
     851# command). 
     852 
     853EXAMPLE_PATH           = 
     854 
     855# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
     856# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and 
     857# *.h) to filter out the source-files in the directories. If left blank all 
     858# files are included. 
    688859 
    689860EXAMPLE_PATTERNS       = * 
    690861 
    691 # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be  
    692 # searched for input files to be used with the \include or \dontinclude  
    693 # commands irrespective of the value of the RECURSIVE tag.  
    694 # Possible values are YES and NO. If left blank NO is used. 
     862# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
     863# searched for input files to be used with the \include or \dontinclude commands 
     864# irrespective of the value of the RECURSIVE tag. 
     865# The default value is: NO. 
    695866 
    696867EXAMPLE_RECURSIVE      = NO 
    697868 
    698 # The IMAGE_PATH tag can be used to specify one or more files or  
    699 # directories that contain image that are included in the documentation (see  
    700 # the \image command). 
    701  
    702 IMAGE_PATH             =  
    703  
    704 # The INPUT_FILTER tag can be used to specify a program that doxygen should  
    705 # invoke to filter for each input file. Doxygen will invoke the filter program  
    706 # by executing (via popen()) the command <filter> <input-file>, where <filter>  
    707 # is the value of the INPUT_FILTER tag, and <input-file> is the name of an  
    708 # input file. Doxygen will then use the output that the filter program writes  
    709 # to standard output.  If FILTER_PATTERNS is specified, this tag will be  
    710 # ignored. 
    711  
    712 INPUT_FILTER           =  
    713  
    714 # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern  
    715 # basis.  Doxygen will compare the file name with each pattern and apply the  
    716 # filter if there is a match.  The filters are a list of the form:  
    717 # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further  
    718 # info on how filters are used. If FILTER_PATTERNS is empty or if  
    719 # non of the patterns match the file name, INPUT_FILTER is applied. 
    720  
    721 FILTER_PATTERNS        =  
    722  
    723 # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using  
    724 # INPUT_FILTER) will be used to filter the input files when producing source  
    725 # files to browse (i.e. when SOURCE_BROWSER is set to YES). 
     869# The IMAGE_PATH tag can be used to specify one or more files or directories 
     870# that contain images that are to be included in the documentation (see the 
     871# \image command). 
     872 
     873IMAGE_PATH             = 
     874 
     875# The INPUT_FILTER tag can be used to specify a program that doxygen should 
     876# invoke to filter for each input file. Doxygen will invoke the filter program 
     877# by executing (via popen()) the command: 
     878# 
     879# <filter> <input-file> 
     880# 
     881# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the 
     882# name of an input file. Doxygen will then use the output that the filter 
     883# program writes to standard output. If FILTER_PATTERNS is specified, this tag 
     884# will be ignored. 
     885# 
     886# Note that the filter must not add or remove lines; it is applied before the 
     887# code is scanned, but not when the output code is generated. If lines are added 
     888# or removed, the anchors will not be placed correctly. 
     889 
     890INPUT_FILTER           = 
     891 
     892# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
     893# basis. Doxygen will compare the file name with each pattern and apply the 
     894# filter if there is a match. The filters are a list of the form: pattern=filter 
     895# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how 
     896# filters are used. If the FILTER_PATTERNS tag is empty or if none of the 
     897# patterns match the file name, INPUT_FILTER is applied. 
     898 
     899FILTER_PATTERNS        = 
     900 
     901# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
     902# INPUT_FILTER) will also be used to filter the input files that are used for 
     903# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). 
     904# The default value is: NO. 
    726905 
    727906FILTER_SOURCE_FILES    = NO 
    728907 
    729 # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file  
    730 # pattern. A pattern will override the setting for FILTER_PATTERN (if any)  
    731 # and it is also possible to disable source filtering for a specific pattern  
    732 # using *.ext= (so without naming a filter). This option only has effect when  
    733 # FILTER_SOURCE_FILES is enabled. 
    734  
    735 FILTER_SOURCE_PATTERNS =  
    736  
    737 #--------------------------------------------------------------------------- 
    738 # configuration options related to source browsing 
    739 #--------------------------------------------------------------------------- 
    740  
    741 # If the SOURCE_BROWSER tag is set to YES then a list of source files will  
    742 # be generated. Documented entities will be cross-referenced with these sources.  
    743 # Note: To get rid of all source code in the generated output, make sure also  
    744 # VERBATIM_HEADERS is set to NO. 
     908# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file 
     909# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and 
     910# it is also possible to disable source filtering for a specific pattern using 
     911# *.ext= (so without naming a filter). 
     912# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. 
     913 
     914FILTER_SOURCE_PATTERNS = 
     915 
     916# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that 
     917# is part of the input, its contents will be placed on the main page 
     918# (index.html). This can be useful if you have a project on for instance GitHub 
     919# and want to reuse the introduction page also for the doxygen output. 
     920 
     921USE_MDFILE_AS_MAINPAGE = 
     922 
     923#--------------------------------------------------------------------------- 
     924# Configuration options related to source browsing 
     925#--------------------------------------------------------------------------- 
     926 
     927# If the SOURCE_BROWSER tag is set to YES then a list of source files will be 
     928# generated. Documented entities will be cross-referenced with these sources. 
     929# 
     930# Note: To get rid of all source code in the generated output, make sure that 
     931# also VERBATIM_HEADERS is set to NO. 
     932# The default value is: NO. 
    745933 
    746934SOURCE_BROWSER         = YES 
    747935 
    748 # Setting the INLINE_SOURCES tag to YES will include the body  
    749 # of functions and classes directly in the documentation. 
     936# Setting the INLINE_SOURCES tag to YES will include the body of functions, 
     937# classes and enums directly into the documentation. 
     938# The default value is: NO. 
    750939 
    751940INLINE_SOURCES         = NO 
    752941 
    753 # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct  
    754 # doxygen to hide any special comment blocks from generated source code  
    755 # fragments. Normal C and C++ comments will always remain visible. 
     942# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any 
     943# special comment blocks from generated source code fragments. Normal C, C++ and 
     944# Fortran comments will always remain visible. 
     945# The default value is: YES. 
    756946 
    757947STRIP_CODE_COMMENTS    = YES 
    758948 
    759 # If the REFERENCED_BY_RELATION tag is set to YES  
    760 # then for each documented function all documented  
    761 # functions referencing it will be listed. 
     949# If the REFERENCED_BY_RELATION tag is set to YES then for each documented 
     950# function all documented functions referencing it will be listed. 
     951# The default value is: NO. 
    762952 
    763953REFERENCED_BY_RELATION = YES 
    764954 
    765 # If the REFERENCES_RELATION tag is set to YES  
    766 # then for each documented function all documented entities  
    767 # called/used by that function will be listed. 
     955# If the REFERENCES_RELATION tag is set to YES then for each documented function 
     956# all documented entities called/used by that function will be listed. 
     957# The default value is: NO. 
    768958 
    769959REFERENCES_RELATION    = YES 
    770960 
    771 # If the REFERENCES_LINK_SOURCE tag is set to YES (the default)  
    772 # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from  
    773 # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will  
    774 # link to the source code.  Otherwise they will link to the documentation. 
     961# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set 
     962# to YES then the hyperlinks from functions in REFERENCES_RELATION and 
     963# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will 
     964# link to the documentation. 
     965# The default value is: YES. 
    775966 
    776967REFERENCES_LINK_SOURCE = YES 
    777968 
    778 # If the USE_HTAGS tag is set to YES then the references to source code  
    779 # will point to the HTML generated by the htags(1) tool instead of doxygen  
    780 # built-in source browser. The htags tool is part of GNU's global source  
    781 # tagging system (see http://www.gnu.org/software/global/global.html). You  
    782 # will need version 4.8.6 or higher. 
     969# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the 
     970# source code will show a tooltip with additional information such as prototype, 
     971# brief description and links to the definition and documentation. Since this 
     972# will make the HTML file larger and loading of large files a bit slower, you 
     973# can opt to disable this feature. 
     974# The default value is: YES. 
     975# This tag requires that the tag SOURCE_BROWSER is set to YES. 
     976 
     977SOURCE_TOOLTIPS        = YES 
     978 
     979# If the USE_HTAGS tag is set to YES then the references to source code will 
     980# point to the HTML generated by the htags(1) tool instead of doxygen built-in 
     981# source browser. The htags tool is part of GNU's global source tagging system 
     982# (see http://www.gnu.org/software/global/global.html). You will need version 
     983# 4.8.6 or higher. 
     984# 
     985# To use it do the following: 
     986# - Install the latest version of global 
     987# - Enable SOURCE_BROWSER and USE_HTAGS in the config file 
     988# - Make sure the INPUT points to the root of the source tree 
     989# - Run doxygen as normal 
     990# 
     991# Doxygen will invoke htags (and that will in turn invoke gtags), so these 
     992# tools must be available from the command line (i.e. in the search path). 
     993# 
     994# The result: instead of the source browser generated by doxygen, the links to 
     995# source code will now point to the output of htags. 
     996# The default value is: NO. 
     997# This tag requires that the tag SOURCE_BROWSER is set to YES. 
    783998 
    784999USE_HTAGS              = NO 
    7851000 
    786 # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen  
    787 # will generate a verbatim copy of the header file for each class for  
    788 # which an include is specified. Set to NO to disable this. 
     1001# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a 
     1002# verbatim copy of the header file for each class for which an include is 
     1003# specified. Set to NO to disable this. 
     1004# See also: Section \class. 
     1005# The default value is: YES. 
    7891006 
    7901007VERBATIM_HEADERS       = YES 
    7911008 
    7921009#--------------------------------------------------------------------------- 
    793 # configuration options related to the alphabetical class index 
    794 #--------------------------------------------------------------------------- 
    795  
    796 # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index  
    797 # of all compounds will be generated. Enable this if the project  
    798 # contains a lot of classes, structs, unions or interfaces. 
     1010# Configuration options related to the alphabetical class index 
     1011#--------------------------------------------------------------------------- 
     1012 
     1013# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all 
     1014# compounds will be generated. Enable this if the project contains a lot of 
     1015# classes, structs, unions or interfaces. 
     1016# The default value is: YES. 
    7991017 
    8001018ALPHABETICAL_INDEX     = YES 
    8011019 
    802 # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then  
    803 # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns  
    804 # in which this list will be split (can be a number in the range [1..20]) 
     1020# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in 
     1021# which the alphabetical index list will be split. 
     1022# Minimum value: 1, maximum value: 20, default value: 5. 
     1023# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. 
    8051024 
    8061025COLS_IN_ALPHA_INDEX    = 5 
    8071026 
    808 # In case all classes in a project start with a common prefix, all  
    809 # classes will be put under the same header in the alphabetical index.  
    810 # The IGNORE_PREFIX tag can be used to specify one or more prefixes that  
    811 # should be ignored while generating the index headers. 
    812  
    813 IGNORE_PREFIX          =  
    814  
    815 #--------------------------------------------------------------------------- 
    816 # configuration options related to the HTML output 
    817 #--------------------------------------------------------------------------- 
    818  
    819 # If the GENERATE_HTML tag is set to YES (the default) Doxygen will  
    820 # generate HTML output. 
     1027# In case all classes in a project start with a common prefix, all classes will 
     1028# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag 
     1029# can be used to specify a prefix (or a list of prefixes) that should be ignored 
     1030# while generating the index headers. 
     1031# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. 
     1032 
     1033IGNORE_PREFIX          = 
     1034 
     1035#--------------------------------------------------------------------------- 
     1036# Configuration options related to the HTML output 
     1037#--------------------------------------------------------------------------- 
     1038 
     1039# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output 
     1040# The default value is: YES. 
    8211041 
    8221042GENERATE_HTML          = YES 
    8231043 
    824 # The HTML_OUTPUT tag is used to specify where the HTML docs will be put.  
    825 # If a relative path is entered the value of OUTPUT_DIRECTORY will be  
    826 # put in front of it. If left blank `html' will be used as the default path. 
     1044# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a 
     1045# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of 
     1046# it. 
     1047# The default directory is: html. 
     1048# This tag requires that the tag GENERATE_HTML is set to YES. 
    8271049 
    8281050HTML_OUTPUT            = html 
    8291051 
    830 # The HTML_FILE_EXTENSION tag can be used to specify the file extension for  
    831 # each generated HTML page (for example: .htm,.php,.asp). If it is left blank  
    832 # doxygen will generate files with .html extension. 
     1052# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each 
     1053# generated HTML page (for example: .htm, .php, .asp). 
     1054# The default value is: .html. 
     1055# This tag requires that the tag GENERATE_HTML is set to YES. 
    8331056 
    8341057HTML_FILE_EXTENSION    = .html 
    8351058 
    836 # The HTML_HEADER tag can be used to specify a personal HTML header for  
    837 # each generated HTML page. If it is left blank doxygen will generate a  
    838 # standard header. Note that when using a custom header you are responsible  
    839 # for the proper inclusion of any scripts and style sheets that doxygen  
    840 # needs, which is dependent on the configuration options used.  
    841 # It is adviced to generate a default header using "doxygen -w html  
    842 # header.html footer.html stylesheet.css YourConfigFile" and then modify  
    843 # that header. Note that the header is subject to change so you typically  
    844 # have to redo this when upgrading to a newer version of doxygen or when 
    845 # changing the value of configuration settings such as GENERATE_TREEVIEW! 
    846  
    847 HTML_HEADER            =  
    848  
    849 # The HTML_FOOTER tag can be used to specify a personal HTML footer for  
    850 # each generated HTML page. If it is left blank doxygen will generate a  
    851 # standard footer. 
    852  
    853 HTML_FOOTER            =  
    854  
    855 # If the HTML_TIMESTAMP tag is set to YES then the generated HTML 
    856 # documentation will contain the timesstamp. 
     1059# The HTML_HEADER tag can be used to specify a user-defined HTML header file for 
     1060# each generated HTML page. If the tag is left blank doxygen will generate a 
     1061# standard header. 
     1062# 
     1063# To get valid HTML the header file that includes any scripts and style sheets 
     1064# that doxygen needs, which is dependent on the configuration options used (e.g. 
     1065# the setting GENERATE_TREEVIEW). It is highly recommended to start with a 
     1066# default header using 
     1067# doxygen -w html new_header.html new_footer.html new_stylesheet.css 
     1068# YourConfigFile 
     1069# and then modify the file new_header.html. See also section "Doxygen usage" 
     1070# for information on how to generate the default header that doxygen normally 
     1071# uses. 
     1072# Note: The header is subject to change so you typically have to regenerate the 
     1073# default header when upgrading to a newer version of doxygen. For a description 
     1074# of the possible markers and block names see the documentation. 
     1075# This tag requires that the tag GENERATE_HTML is set to YES. 
     1076 
     1077HTML_HEADER            = 
     1078 
     1079# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each 
     1080# generated HTML page. If the tag is left blank doxygen will generate a standard 
     1081# footer. See HTML_HEADER for more information on how to generate a default 
     1082# footer and what special commands can be used inside the footer. See also 
     1083# section "Doxygen usage" for information on how to generate the default footer 
     1084# that doxygen normally uses. 
     1085# This tag requires that the tag GENERATE_HTML is set to YES. 
     1086 
     1087HTML_FOOTER            = 
     1088 
     1089# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style 
     1090# sheet that is used by each HTML page. It can be used to fine-tune the look of 
     1091# the HTML output. If left blank doxygen will generate a default style sheet. 
     1092# See also section "Doxygen usage" for information on how to generate the style 
     1093# sheet that doxygen normally uses. 
     1094# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as 
     1095# it is more robust and this tag (HTML_STYLESHEET) will in the future become 
     1096# obsolete. 
     1097# This tag requires that the tag GENERATE_HTML is set to YES. 
     1098 
     1099HTML_STYLESHEET        = 
     1100 
     1101# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined 
     1102# cascading style sheets that are included after the standard style sheets 
     1103# created by doxygen. Using this option one can overrule certain style aspects. 
     1104# This is preferred over using HTML_STYLESHEET since it does not replace the 
     1105# standard style sheet and is therefore more robust against future updates. 
     1106# Doxygen will copy the style sheet files to the output directory. 
     1107# Note: The order of the extra style sheet files is of importance (e.g. the last 
     1108# style sheet in the list overrules the setting of the previous ones in the 
     1109# list). For an example see the documentation. 
     1110# This tag requires that the tag GENERATE_HTML is set to YES. 
     1111 
     1112HTML_EXTRA_STYLESHEET  = 
     1113 
     1114# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or 
     1115# other source files which should be copied to the HTML output directory. Note 
     1116# that these files will be copied to the base HTML output directory. Use the 
     1117# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these 
     1118# files. In the HTML_STYLESHEET file, use the file name only. Also note that the 
     1119# files will be copied as-is; there are no commands or markers available. 
     1120# This tag requires that the tag GENERATE_HTML is set to YES. 
     1121 
     1122HTML_EXTRA_FILES       = 
     1123 
     1124# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen 
     1125# will adjust the colors in the style sheet and background images according to 
     1126# this color. Hue is specified as an angle on a colorwheel, see 
     1127# http://en.wikipedia.org/wiki/Hue for more information. For instance the value 
     1128# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 
     1129# purple, and 360 is red again. 
     1130# Minimum value: 0, maximum value: 359, default value: 220. 
     1131# This tag requires that the tag GENERATE_HTML is set to YES. 
     1132 
     1133HTML_COLORSTYLE_HUE    = 224 
     1134 
     1135# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors 
     1136# in the HTML output. For a value of 0 the output will use grayscales only. A 
     1137# value of 255 will produce the most vivid colors. 
     1138# Minimum value: 0, maximum value: 255, default value: 100. 
     1139# This tag requires that the tag GENERATE_HTML is set to YES. 
     1140 
     1141HTML_COLORSTYLE_SAT    = 63 
     1142 
     1143# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the 
     1144# luminance component of the colors in the HTML output. Values below 100 
     1145# gradually make the output lighter, whereas values above 100 make the output 
     1146# darker. The value divided by 100 is the actual gamma applied, so 80 represents 
     1147# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not 
     1148# change the gamma. 
     1149# Minimum value: 40, maximum value: 240, default value: 80. 
     1150# This tag requires that the tag GENERATE_HTML is set to YES. 
     1151 
     1152HTML_COLORSTYLE_GAMMA  = 152 
     1153 
     1154# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 
     1155# page will contain the date and time when the page was generated. Setting this 
     1156# to YES can help to show when doxygen was last run and thus if the 
     1157# documentation is up to date. 
     1158# The default value is: NO. 
     1159# This tag requires that the tag GENERATE_HTML is set to YES. 
    8571160 
    8581161HTML_TIMESTAMP         = YES 
    8591162 
    860 # The HTML_STYLESHEET tag can be used to specify a user-defined cascading  
    861 # style sheet that is used by each HTML page. It can be used to  
    862 # fine-tune the look of the HTML output. If the tag is left blank doxygen  
    863 # will generate a default style sheet. Note that doxygen will try to copy  
    864 # the style sheet file to the HTML output directory, so don't put your own  
    865 # stylesheet in the HTML output directory as well, or it will be erased! 
    866  
    867 HTML_STYLESHEET        =  
    868  
    869 # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or  
    870 # other source files which should be copied to the HTML output directory. Note  
    871 # that these files will be copied to the base HTML output directory. Use the  
    872 # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these  
    873 # files. In the HTML_STYLESHEET file, use the file name only. Also note that  
    874 # the files will be copied as-is; there are no commands or markers available. 
    875  
    876 HTML_EXTRA_FILES       =  
    877  
    878 # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.  
    879 # Doxygen will adjust the colors in the stylesheet and background images  
    880 # according to this color. Hue is specified as an angle on a colorwheel,  
    881 # see http://en.wikipedia.org/wiki/Hue for more information.  
    882 # For instance the value 0 represents red, 60 is yellow, 120 is green,  
    883 # 180 is cyan, 240 is blue, 300 purple, and 360 is red again.  
    884 # The allowed range is 0 to 359. 
    885  
    886 HTML_COLORSTYLE_HUE    = 224 
    887  
    888 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of  
    889 # the colors in the HTML output. For a value of 0 the output will use  
    890 # grayscales only. A value of 255 will produce the most vivid colors. 
    891  
    892 HTML_COLORSTYLE_SAT    = 63 
    893  
    894 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to  
    895 # the luminance component of the colors in the HTML output. Values below  
    896 # 100 gradually make the output lighter, whereas values above 100 make  
    897 # the output darker. The value divided by 100 is the actual gamma applied,  
    898 # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,  
    899 # and 100 does not change the gamma. 
    900  
    901 HTML_COLORSTYLE_GAMMA  = 152 
    902  
    903 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML  
    904 # page will contain the date and time when the page was generated. Setting  
    905 # this to NO can help when comparing the output of multiple runs. 
    906  
    907 HTML_TIMESTAMP         = YES 
    908  
    909 # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,  
    910 # files or namespaces will be aligned in HTML using tables. If set to  
    911 # NO a bullet list will be used. 
    912  
    913 HTML_ALIGN_MEMBERS     = YES 
    914  
    915 # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML  
    916 # documentation will contain sections that can be hidden and shown after the  
    917 # page has loaded. For this to work a browser that supports  
    918 # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox  
    919 # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). 
     1163# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
     1164# documentation will contain sections that can be hidden and shown after the 
     1165# page has loaded. 
     1166# The default value is: NO. 
     1167# This tag requires that the tag GENERATE_HTML is set to YES. 
    9201168 
    9211169HTML_DYNAMIC_SECTIONS  = YES 
    9221170 
    923 # If the GENERATE_DOCSET tag is set to YES, additional index files  
    924 # will be generated that can be used as input for Apple's Xcode 3  
    925 # integrated development environment, introduced with OSX 10.5 (Leopard).  
    926 # To create a documentation set, doxygen will generate a Makefile in the  
    927 # HTML output directory. Running make will produce the docset in that  
    928 # directory and running "make install" will install the docset in  
    929 # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find  
    930 # it at startup.  
    931 # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html  
     1171# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries 
     1172# shown in the various tree structured indices initially; the user can expand 
     1173# and collapse entries dynamically later on. Doxygen will expand the tree to 
     1174# such a level that at most the specified number of entries are visible (unless 
     1175# a fully collapsed tree already exceeds this amount). So setting the number of 
     1176# entries 1 will produce a full collapsed tree by default. 0 is a special value 
     1177# representing an infinite number of entries and will result in a full expanded 
     1178# tree by default. 
     1179# Minimum value: 0, maximum value: 9999, default value: 100. 
     1180# This tag requires that the tag GENERATE_HTML is set to YES. 
     1181 
     1182HTML_INDEX_NUM_ENTRIES = 100 
     1183 
     1184# If the GENERATE_DOCSET tag is set to YES, additional index files will be 
     1185# generated that can be used as input for Apple's Xcode 3 integrated development 
     1186# environment (see: http://developer.apple.com/tools/xcode/), introduced with 
     1187# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a 
     1188# Makefile in the HTML output directory. Running make will produce the docset in 
     1189# that directory and running make install will install the docset in 
     1190# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at 
     1191# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html 
    9321192# for more information. 
     1193# The default value is: NO. 
     1194# This tag requires that the tag GENERATE_HTML is set to YES. 
    9331195 
    9341196GENERATE_DOCSET        = NO 
    9351197 
    936 # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the  
    937 # feed. A documentation feed provides an umbrella under which multiple  
    938 # documentation sets from a single provider (such as a company or product suite)  
    939 # can be grouped. 
     1198# This tag determines the name of the docset feed. A documentation feed provides 
     1199# an umbrella under which multiple documentation sets from a single provider 
     1200# (such as a company or product suite) can be grouped. 
     1201# The default value is: Doxygen generated docs. 
     1202# This tag requires that the tag GENERATE_DOCSET is set to YES. 
    9401203 
    9411204DOCSET_FEEDNAME        = "Doxygen generated docs" 
    9421205 
    943 # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that  
    944 # should uniquely identify the documentation set bundle. This should be a  
    945 # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen  
    946 # will append .docset to the name. 
     1206# This tag specifies a string that should uniquely identify the documentation 
     1207# set bundle. This should be a reverse domain-name style string, e.g. 
     1208# com.mycompany.MyDocSet. Doxygen will append .docset to the name. 
     1209# The default value is: org.doxygen.Project. 
     1210# This tag requires that the tag GENERATE_DOCSET is set to YES. 
    9471211 
    9481212DOCSET_BUNDLE_ID       = org.doxygen.Project 
    9491213 
    950 # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify  
    951 # the documentation publisher. This should be a reverse domain-name style  
     1214# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify 
     1215# the documentation publisher. This should be a reverse domain-name style 
    9521216# string, e.g. com.mycompany.MyDocSet.documentation. 
     1217# The default value is: org.doxygen.Publisher. 
     1218# This tag requires that the tag GENERATE_DOCSET is set to YES. 
    9531219 
    9541220DOCSET_PUBLISHER_ID    = org.doxygen.Publisher 
    9551221 
    956 # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. 
     1222# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. 
     1223# The default value is: Publisher. 
     1224# This tag requires that the tag GENERATE_DOCSET is set to YES. 
    9571225 
    9581226DOCSET_PUBLISHER_NAME  = Publisher 
    9591227 
    960 # If the GENERATE_HTMLHELP tag is set to YES, additional index files  
    961 # will be generated that can be used as input for tools like the  
    962 # Microsoft HTML help workshop to generate a compiled HTML help file (.chm)  
    963 # of the generated HTML documentation. 
     1228# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three 
     1229# additional HTML index files: index.hhp, index.hhc, and index.hhk. The 
     1230# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop 
     1231# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on 
     1232# Windows. 
     1233# 
     1234# The HTML Help Workshop contains a compiler that can convert all HTML output 
     1235# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML 
     1236# files are now used as the Windows 98 help format, and will replace the old 
     1237# Windows help format (.hlp) on all Windows platforms in the future. Compressed 
     1238# HTML files also contain an index, a table of contents, and you can search for 
     1239# words in the documentation. The HTML workshop also contains a viewer for 
     1240# compressed HTML files. 
     1241# The default value is: NO. 
     1242# This tag requires that the tag GENERATE_HTML is set to YES. 
    9641243 
    9651244GENERATE_HTMLHELP      = NO 
    9661245 
    967 # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can  
    968 # be used to specify the file name of the resulting .chm file. You  
    969 # can add a path in front of the file if the result should not be  
     1246# The CHM_FILE tag can be used to specify the file name of the resulting .chm 
     1247# file. You can add a path in front of the file if the result should not be 
    9701248# written to the html output directory. 
    971  
    972 CHM_FILE               =  
    973  
    974 # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can  
    975 # be used to specify the location (absolute path including file name) of  
    976 # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run  
    977 # the HTML help compiler on the generated index.hhp. 
    978  
    979 HHC_LOCATION           =  
    980  
    981 # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag  
    982 # controls if a separate .chi index file is generated (YES) or that  
    983 # it should be included in the master .chm file (NO). 
     1249# This tag requires that the tag GENERATE_HTMLHELP is set to YES. 
     1250 
     1251CHM_FILE               = 
     1252 
     1253# The HHC_LOCATION tag can be used to specify the location (absolute path 
     1254# including file name) of the HTML help compiler (hhc.exe). If non-empty, 
     1255# doxygen will try to run the HTML help compiler on the generated index.hhp. 
     1256# The file has to be specified with full path. 
     1257# This tag requires that the tag GENERATE_HTMLHELP is set to YES. 
     1258 
     1259HHC_LOCATION           = 
     1260 
     1261# The GENERATE_CHI flag controls if a separate .chi index file is generated 
     1262# (YES) or that it should be included in the master .chm file (NO). 
     1263# The default value is: NO. 
     1264# This tag requires that the tag GENERATE_HTMLHELP is set to YES. 
    9841265 
    9851266GENERATE_CHI           = NO 
    9861267 
    987 # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING  
    988 # is used to encode HtmlHelp index (hhk), content (hhc) and project file  
    989 # content. 
    990  
    991 CHM_INDEX_ENCODING     =  
    992  
    993 # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag  
    994 # controls whether a binary table of contents is generated (YES) or a  
    995 # normal table of contents (NO) in the .chm file. 
     1268# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) 
     1269# and project file content. 
     1270# This tag requires that the tag GENERATE_HTMLHELP is set to YES. 
     1271 
     1272CHM_INDEX_ENCODING     = 
     1273 
     1274# The BINARY_TOC flag controls whether a binary table of contents is generated 
     1275# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it 
     1276# enables the Previous and Next buttons. 
     1277# The default value is: NO. 
     1278# This tag requires that the tag GENERATE_HTMLHELP is set to YES. 
    9961279 
    9971280BINARY_TOC             = NO 
    9981281 
    999 # The TOC_EXPAND flag can be set to YES to add extra items for group members  
    1000 # to the contents of the HTML help documentation and to the tree view. 
     1282# The TOC_EXPAND flag can be set to YES to add extra items for group members to 
     1283# the table of contents of the HTML help documentation and to the tree view. 
     1284# The default value is: NO. 
     1285# This tag requires that the tag GENERATE_HTMLHELP is set to YES. 
    10011286 
    10021287TOC_EXPAND             = NO 
    10031288 
    1004 # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and  
    1005 # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated  
    1006 # that can be used as input for Qt's qhelpgenerator to generate a  
    1007 # Qt Compressed Help (.qch) of the generated HTML documentation. 
     1289# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and 
     1290# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that 
     1291# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help 
     1292# (.qch) of the generated HTML documentation. 
     1293# The default value is: NO. 
     1294# This tag requires that the tag GENERATE_HTML is set to YES. 
    10081295 
    10091296GENERATE_QHP           = NO 
    10101297 
    1011 # If the QHG_LOCATION tag is specified, the QCH_FILE tag can  
    1012 # be used to specify the file name of the resulting .qch file.  
    1013 # The path specified is relative to the HTML output folder. 
    1014  
    1015 QCH_FILE               =  
    1016  
    1017 # The QHP_NAMESPACE tag specifies the namespace to use when generating  
    1018 # Qt Help Project output. For more information please see  
    1019 # http://doc.trolltech.com/qthelpproject.html#namespace 
     1298# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify 
     1299# the file name of the resulting .qch file. The path specified is relative to 
     1300# the HTML output folder. 
     1301# This tag requires that the tag GENERATE_QHP is set to YES. 
     1302 
     1303QCH_FILE               = 
     1304 
     1305# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help 
     1306# Project output. For more information please see Qt Help Project / Namespace 
     1307# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). 
     1308# The default value is: org.doxygen.Project. 
     1309# This tag requires that the tag GENERATE_QHP is set to YES. 
    10201310 
    10211311QHP_NAMESPACE          = org.doxygen.Project 
    10221312 
    1023 # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating  
    1024 # Qt Help Project output. For more information please see  
    1025 # http://doc.trolltech.com/qthelpproject.html#virtual-folders 
     1313# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt 
     1314# Help Project output. For more information please see Qt Help Project / Virtual 
     1315# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- 
     1316# folders). 
     1317# The default value is: doc. 
     1318# This tag requires that the tag GENERATE_QHP is set to YES. 
    10261319 
    10271320QHP_VIRTUAL_FOLDER     = doc 
    10281321 
    1029 # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to  
    1030 # add. For more information please see  
    1031 # http://doc.trolltech.com/qthelpproject.html#custom-filters 
    1032  
    1033 QHP_CUST_FILTER_NAME   =  
    1034  
    1035 # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the  
    1036 # custom filter to add. For more information please see  
    1037 # <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">  
    1038 # Qt Help Project / Custom Filters</a>. 
    1039  
    1040 QHP_CUST_FILTER_ATTRS  =  
    1041  
    1042 # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this  
    1043 # project's  
    1044 # filter section matches.  
    1045 # <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">  
    1046 # Qt Help Project / Filter Attributes</a>. 
    1047  
    1048 QHP_SECT_FILTER_ATTRS  =  
    1049  
    1050 # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can  
    1051 # be used to specify the location of Qt's qhelpgenerator.  
    1052 # If non-empty doxygen will try to run qhelpgenerator on the generated  
    1053 # .qhp file. 
    1054  
    1055 QHG_LOCATION           =  
    1056  
    1057 # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files   
    1058 # will be generated, which together with the HTML files, form an Eclipse help  
    1059 # plugin. To install this plugin and make it available under the help contents  
    1060 # menu in Eclipse, the contents of the directory containing the HTML and XML  
    1061 # files needs to be copied into the plugins directory of eclipse. The name of  
    1062 # the directory within the plugins directory should be the same as  
    1063 # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before  
    1064 # the help appears. 
     1322# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom 
     1323# filter to add. For more information please see Qt Help Project / Custom 
     1324# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- 
     1325# filters). 
     1326# This tag requires that the tag GENERATE_QHP is set to YES. 
     1327 
     1328QHP_CUST_FILTER_NAME   = 
     1329 
     1330# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the 
     1331# custom filter to add. For more information please see Qt Help Project / Custom 
     1332# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- 
     1333# filters). 
     1334# This tag requires that the tag GENERATE_QHP is set to YES. 
     1335 
     1336QHP_CUST_FILTER_ATTRS  = 
     1337 
     1338# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this 
     1339# project's filter section matches. Qt Help Project / Filter Attributes (see: 
     1340# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). 
     1341# This tag requires that the tag GENERATE_QHP is set to YES. 
     1342 
     1343QHP_SECT_FILTER_ATTRS  = 
     1344 
     1345# The QHG_LOCATION tag can be used to specify the location of Qt's 
     1346# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the 
     1347# generated .qhp file. 
     1348# This tag requires that the tag GENERATE_QHP is set to YES. 
     1349 
     1350QHG_LOCATION           = 
     1351 
     1352# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be 
     1353# generated, together with the HTML files, they form an Eclipse help plugin. To 
     1354# install this plugin and make it available under the help contents menu in 
     1355# Eclipse, the contents of the directory containing the HTML and XML files needs 
     1356# to be copied into the plugins directory of eclipse. The name of the directory 
     1357# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. 
     1358# After copying Eclipse needs to be restarted before the help appears. 
     1359# The default value is: NO. 
     1360# This tag requires that the tag GENERATE_HTML is set to YES. 
    10651361 
    10661362GENERATE_ECLIPSEHELP   = NO 
    10671363 
    1068 # A unique identifier for the eclipse help plugin. When installing the plugin  
    1069 # the directory name containing the HTML and XML files should also have  
    1070 # this name. 
     1364# A unique identifier for the Eclipse help plugin. When installing the plugin 
     1365# the directory name containing the HTML and XML files should also have this 
     1366# name. Each documentation set should have its own identifier. 
     1367# The default value is: org.doxygen.Project. 
     1368# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. 
    10711369 
    10721370ECLIPSE_DOC_ID         = org.doxygen.Project 
    10731371 
    1074 # The DISABLE_INDEX tag can be used to turn on/off the condensed index at  
    1075 # top of each HTML page. The value NO (the default) enables the index and  
    1076 # the value YES disables it. 
     1372# If you want full control over the layout of the generated HTML pages it might 
     1373# be necessary to disable the index and replace it with your own. The 
     1374# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top 
     1375# of each HTML page. A value of NO enables the index and the value YES disables 
     1376# it. Since the tabs in the index contain the same information as the navigation 
     1377# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. 
     1378# The default value is: NO. 
     1379# This tag requires that the tag GENERATE_HTML is set to YES. 
    10771380 
    10781381DISABLE_INDEX          = NO 
    10791382 
    1080 # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values  
    1081 # (range [0,1..20]) that doxygen will group on one line in the generated HTML  
    1082 # documentation. Note that a value of 0 will completely suppress the enum  
    1083 # values from appearing in the overview section. 
     1383# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
     1384# structure should be generated to display hierarchical information. If the tag 
     1385# value is set to YES, a side panel will be generated containing a tree-like 
     1386# index structure (just like the one that is generated for HTML Help). For this 
     1387# to work a browser that supports JavaScript, DHTML, CSS and frames is required 
     1388# (i.e. any modern browser). Windows users are probably better off using the 
     1389# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can 
     1390# further fine-tune the look of the index. As an example, the default style 
     1391# sheet generated by doxygen has an example that shows how to put an image at 
     1392# the root of the tree instead of the PROJECT_NAME. Since the tree basically has 
     1393# the same information as the tab index, you could consider setting 
     1394# DISABLE_INDEX to YES when enabling this option. 
     1395# The default value is: NO. 
     1396# This tag requires that the tag GENERATE_HTML is set to YES. 
     1397 
     1398GENERATE_TREEVIEW      = YES 
     1399 
     1400# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that 
     1401# doxygen will group on one line in the generated HTML documentation. 
     1402# 
     1403# Note that a value of 0 will completely suppress the enum values from appearing 
     1404# in the overview section. 
     1405# Minimum value: 0, maximum value: 20, default value: 4. 
     1406# This tag requires that the tag GENERATE_HTML is set to YES. 
    10841407 
    10851408ENUM_VALUES_PER_LINE   = 4 
    10861409 
    1087 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index  
    1088 # structure should be generated to display hierarchical information.  
    1089 # If the tag value is set to YES, a side panel will be generated  
    1090 # containing a tree-like index structure (just like the one that  
    1091 # is generated for HTML Help). For this to work a browser that supports  
    1092 # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).  
    1093 # Windows users are probably better off using the HTML help feature. 
    1094  
    1095 GENERATE_TREEVIEW      = YES 
    1096  
    1097 # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,  
    1098 # and Class Hierarchy pages using a tree view instead of an ordered list. 
    1099  
    1100 USE_INLINE_TREES       = YES 
    1101  
    1102 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be  
    1103 # used to set the initial width (in pixels) of the frame in which the tree  
    1104 # is shown. 
     1410# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used 
     1411# to set the initial width (in pixels) of the frame in which the tree is shown. 
     1412# Minimum value: 0, maximum value: 1500, default value: 250. 
     1413# This tag requires that the tag GENERATE_HTML is set to YES. 
    11051414 
    11061415TREEVIEW_WIDTH         = 250 
    11071416 
    1108 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open  
    1109 # links to external symbols imported via tag files in a separate window. 
     1417# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to 
     1418# external symbols imported via tag files in a separate window. 
     1419# The default value is: NO. 
     1420# This tag requires that the tag GENERATE_HTML is set to YES. 
    11101421 
    11111422EXT_LINKS_IN_WINDOW    = NO 
    11121423 
    1113 # Use this tag to change the font size of Latex formulas included  
    1114 # as images in the HTML documentation. The default is 10. Note that  
    1115 # when you change the font size after a successful doxygen run you need  
    1116 # to manually remove any form_*.png images from the HTML output directory  
    1117 # to force them to be regenerated. 
     1424# Use this tag to change the font size of LaTeX formulas included as images in 
     1425# the HTML documentation. When you change the font size after a successful 
     1426# doxygen run you need to manually remove any form_*.png images from the HTML 
     1427# output directory to force them to be regenerated. 
     1428# Minimum value: 8, maximum value: 50, default value: 10. 
     1429# This tag requires that the tag GENERATE_HTML is set to YES. 
    11181430 
    11191431FORMULA_FONTSIZE       = 10 
    11201432 
    1121 # Use the FORMULA_TRANPARENT tag to determine whether or not the images  
    1122 # generated for formulas are transparent PNGs. Transparent PNGs are  
    1123 # not supported properly for IE 6.0, but are supported on all modern browsers.  
    1124 # Note that when changing this option you need to delete any form_*.png files  
    1125 # in the HTML output before the changes have effect. 
     1433# Use the FORMULA_TRANPARENT tag to determine whether or not the images 
     1434# generated for formulas are transparent PNGs. Transparent PNGs are not 
     1435# supported properly for IE 6.0, but are supported on all modern browsers. 
     1436# 
     1437# Note that when changing this option you need to delete any form_*.png files in 
     1438# the HTML output directory before the changes have effect. 
     1439# The default value is: YES. 
     1440# This tag requires that the tag GENERATE_HTML is set to YES. 
    11261441 
    11271442FORMULA_TRANSPARENT    = YES 
    11281443 
    1129 # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax  
    1130 # (see http://www.mathjax.org) which uses client side Javascript for the  
    1131 # rendering instead of using prerendered bitmaps. Use this if you do not  
    1132 # have LaTeX installed or if you want to formulas look prettier in the HTML  
    1133 # output. When enabled you also need to install MathJax separately and  
    1134 # configure the path to it using the MATHJAX_RELPATH option. 
     1444# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see 
     1445# http://www.mathjax.org) which uses client side Javascript for the rendering 
     1446# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX 
     1447# installed or if you want to formulas look prettier in the HTML output. When 
     1448# enabled you may also need to install MathJax separately and configure the path 
     1449# to it using the MATHJAX_RELPATH option. 
     1450# The default value is: NO. 
     1451# This tag requires that the tag GENERATE_HTML is set to YES. 
    11351452 
    11361453USE_MATHJAX            = NO 
    11371454 
    1138 # When MathJax is enabled you need to specify the location relative to the  
    1139 # HTML output directory using the MATHJAX_RELPATH option. The destination  
    1140 # directory should contain the MathJax.js script. For instance, if the mathjax  
    1141 # directory is located at the same level as the HTML output directory, then  
    1142 # MATHJAX_RELPATH should be ../mathjax. The default value points to the  
    1143 # mathjax.org site, so you can quickly see the result without installing  
    1144 # MathJax, but it is strongly recommended to install a local copy of MathJax  
    1145 # before deployment. 
     1455# When MathJax is enabled you can set the default output format to be used for 
     1456# the MathJax output. See the MathJax site (see: 
     1457# http://docs.mathjax.org/en/latest/output.html) for more details. 
     1458# Possible values are: HTML-CSS (which is slower, but has the best 
     1459# compatibility), NativeMML (i.e. MathML) and SVG. 
     1460# The default value is: HTML-CSS. 
     1461# This tag requires that the tag USE_MATHJAX is set to YES. 
     1462 
     1463MATHJAX_FORMAT         = HTML-CSS 
     1464 
     1465# When MathJax is enabled you need to specify the location relative to the HTML 
     1466# output directory using the MATHJAX_RELPATH option. The destination directory 
     1467# should contain the MathJax.js script. For instance, if the mathjax directory 
     1468# is located at the same level as the HTML output directory, then 
     1469# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax 
     1470# Content Delivery Network so you can quickly see the result without installing 
     1471# MathJax. However, it is strongly recommended to install a local copy of 
     1472# MathJax from http://www.mathjax.org before deployment. 
     1473# The default value is: http://cdn.mathjax.org/mathjax/latest. 
     1474# This tag requires that the tag USE_MATHJAX is set to YES. 
    11461475 
    11471476MATHJAX_RELPATH        = http://www.mathjax.org/mathjax 
    11481477 
    1149 # When the SEARCHENGINE tag is enabled doxygen will generate a search box  
    1150 # for the HTML output. The underlying search engine uses javascript  
    1151 # and DHTML and should work on any modern browser. Note that when using  
    1152 # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets  
    1153 # (GENERATE_DOCSET) there is already a search function so this one should  
    1154 # typically be disabled. For large projects the javascript based search engine  
    1155 # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. 
     1478# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax 
     1479# extension names that should be enabled during MathJax rendering. For example 
     1480# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols 
     1481# This tag requires that the tag USE_MATHJAX is set to YES. 
     1482 
     1483MATHJAX_EXTENSIONS     = 
     1484 
     1485# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces 
     1486# of code that will be used on startup of the MathJax code. See the MathJax site 
     1487# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an 
     1488# example see the documentation. 
     1489# This tag requires that the tag USE_MATHJAX is set to YES. 
     1490 
     1491MATHJAX_CODEFILE       = 
     1492 
     1493# When the SEARCHENGINE tag is enabled doxygen will generate a search box for 
     1494# the HTML output. The underlying search engine uses javascript and DHTML and 
     1495# should work on any modern browser. Note that when using HTML help 
     1496# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) 
     1497# there is already a search function so this one should typically be disabled. 
     1498# For large projects the javascript based search engine can be slow, then 
     1499# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to 
     1500# search using the keyboard; to jump to the search box use <access key> + S 
     1501# (what the <access key> is depends on the OS and browser, but it is typically 
     1502# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down 
     1503# key> to jump into the search results window, the results can be navigated 
     1504# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel 
     1505# the search. The filter options can be selected when the cursor is inside the 
     1506# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys> 
     1507# to select a filter and <Enter> or <escape> to activate or cancel the filter 
     1508# option. 
     1509# The default value is: YES. 
     1510# This tag requires that the tag GENERATE_HTML is set to YES. 
    11561511 
    11571512SEARCHENGINE           = YES 
    11581513 
    1159 # When the SERVER_BASED_SEARCH tag is enabled the search engine will be  
    1160 # implemented using a PHP enabled web server instead of at the web client  
    1161 # using Javascript. Doxygen will generate the search PHP script and index  
    1162 # file to put on the web server. The advantage of the server  
    1163 # based approach is that it scales better to large projects and allows  
    1164 # full text search. The disadvantages are that it is more difficult to setup  
    1165 # and does not have live searching capabilities. 
     1514# When the SERVER_BASED_SEARCH tag is enabled the search engine will be 
     1515# implemented using a web server instead of a web client using Javascript. There 
     1516# are two flavors of web server based searching depending on the EXTERNAL_SEARCH 
     1517# setting. When disabled, doxygen will generate a PHP script for searching and 
     1518# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing 
     1519# and searching needs to be provided by external tools. See the section 
     1520# "External Indexing and Searching" for details. 
     1521# The default value is: NO. 
     1522# This tag requires that the tag SEARCHENGINE is set to YES. 
    11661523 
    11671524SERVER_BASED_SEARCH    = NO 
    11681525 
    1169 #--------------------------------------------------------------------------- 
    1170 # configuration options related to the LaTeX output 
    1171 #--------------------------------------------------------------------------- 
    1172  
    1173 # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will  
    1174 # generate Latex output. 
     1526# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP 
     1527# script for searching. Instead the search results are written to an XML file 
     1528# which needs to be processed by an external indexer. Doxygen will invoke an 
     1529# external search engine pointed to by the SEARCHENGINE_URL option to obtain the 
     1530# search results. 
     1531# 
     1532# Doxygen ships with an example indexer (doxyindexer) and search engine 
     1533# (doxysearch.cgi) which are based on the open source search engine library 
     1534# Xapian (see: http://xapian.org/). 
     1535# 
     1536# See the section "External Indexing and Searching" for details. 
     1537# The default value is: NO. 
     1538# This tag requires that the tag SEARCHENGINE is set to YES. 
     1539 
     1540EXTERNAL_SEARCH        = NO 
     1541 
     1542# The SEARCHENGINE_URL should point to a search engine hosted by a web server 
     1543# which will return the search results when EXTERNAL_SEARCH is enabled. 
     1544# 
     1545# Doxygen ships with an example indexer (doxyindexer) and search engine 
     1546# (doxysearch.cgi) which are based on the open source search engine library 
     1547# Xapian (see: http://xapian.org/). See the section "External Indexing and 
     1548# Searching" for details. 
     1549# This tag requires that the tag SEARCHENGINE is set to YES. 
     1550 
     1551SEARCHENGINE_URL       = 
     1552 
     1553# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed 
     1554# search data is written to a file for indexing by an external tool. With the 
     1555# SEARCHDATA_FILE tag the name of this file can be specified. 
     1556# The default file is: searchdata.xml. 
     1557# This tag requires that the tag SEARCHENGINE is set to YES. 
     1558 
     1559SEARCHDATA_FILE        = searchdata.xml 
     1560 
     1561# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the 
     1562# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is 
     1563# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple 
     1564# projects and redirect the results back to the right project. 
     1565# This tag requires that the tag SEARCHENGINE is set to YES. 
     1566 
     1567EXTERNAL_SEARCH_ID     = 
     1568 
     1569# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen 
     1570# projects other than the one defined by this configuration file, but that are 
     1571# all added to the same external search index. Each project needs to have a 
     1572# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of 
     1573# to a relative location where the documentation can be found. The format is: 
     1574# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... 
     1575# This tag requires that the tag SEARCHENGINE is set to YES. 
     1576 
     1577EXTRA_SEARCH_MAPPINGS  = 
     1578 
     1579#--------------------------------------------------------------------------- 
     1580# Configuration options related to the LaTeX output 
     1581#--------------------------------------------------------------------------- 
     1582 
     1583# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. 
     1584# The default value is: YES. 
    11751585 
    11761586GENERATE_LATEX         = NO 
    11771587 
    1178 # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.  
    1179 # If a relative path is entered the value of OUTPUT_DIRECTORY will be  
    1180 # put in front of it. If left blank `latex' will be used as the default path. 
     1588# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a 
     1589# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of 
     1590# it. 
     1591# The default directory is: latex. 
     1592# This tag requires that the tag GENERATE_LATEX is set to YES. 
    11811593 
    11821594LATEX_OUTPUT           = latex 
    11831595 
    1184 # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be  
    1185 # invoked. If left blank `latex' will be used as the default command name.  
    1186 # Note that when enabling USE_PDFLATEX this option is only used for  
    1187 # generating bitmaps for formulas in the HTML output, but not in the  
    1188 # Makefile that is written to the output directory. 
     1596# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
     1597# invoked. 
     1598# 
     1599# Note that when enabling USE_PDFLATEX this option is only used for generating 
     1600# bitmaps for formulas in the HTML output, but not in the Makefile that is 
     1601# written to the output directory. 
     1602# The default file is: latex. 
     1603# This tag requires that the tag GENERATE_LATEX is set to YES. 
    11891604 
    11901605LATEX_CMD_NAME         = latex 
    11911606 
    1192 # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to  
    1193 # generate index for LaTeX. If left blank `makeindex' will be used as the  
    1194 # default command name. 
     1607# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate 
     1608# index for LaTeX. 
     1609# The default file is: makeindex. 
     1610# This tag requires that the tag GENERATE_LATEX is set to YES. 
    11951611 
    11961612MAKEINDEX_CMD_NAME     = makeindex 
    11971613 
    1198 # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact  
    1199 # LaTeX documents. This may be useful for small projects and may help to  
    1200 # save some trees in general. 
     1614# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX 
     1615# documents. This may be useful for small projects and may help to save some 
     1616# trees in general. 
     1617# The default value is: NO. 
     1618# This tag requires that the tag GENERATE_LATEX is set to YES. 
    12011619 
    12021620COMPACT_LATEX          = NO 
    12031621 
    1204 # The PAPER_TYPE tag can be used to set the paper type that is used  
    1205 # by the printer. Possible values are: a4, letter, legal and  
    1206 # executive. If left blank a4wide will be used. 
     1622# The PAPER_TYPE tag can be used to set the paper type that is used by the 
     1623# printer. 
     1624# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x 
     1625# 14 inches) and executive (7.25 x 10.5 inches). 
     1626# The default value is: a4. 
     1627# This tag requires that the tag GENERATE_LATEX is set to YES. 
    12071628 
    12081629PAPER_TYPE             = a4 
    12091630 
    1210 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX  
    1211 # packages that should be included in the LaTeX output. 
    1212  
    1213 EXTRA_PACKAGES         =  
    1214  
    1215 # The LATEX_HEADER tag can be used to specify a personal LaTeX header for  
    1216 # the generated latex document. The header should contain everything until  
    1217 # the first chapter. If it is left blank doxygen will generate a  
    1218 # standard header. Notice: only use this tag if you know what you are doing! 
    1219  
    1220 LATEX_HEADER           =  
    1221  
    1222 # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for  
    1223 # the generated latex document. The footer should contain everything after  
    1224 # the last chapter. If it is left blank doxygen will generate a  
    1225 # standard footer. Notice: only use this tag if you know what you are doing! 
    1226  
    1227 LATEX_FOOTER           =  
    1228  
    1229 # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated  
    1230 # is prepared for conversion to pdf (using ps2pdf). The pdf file will  
    1231 # contain links (just like the HTML output) instead of page references  
    1232 # This makes the output suitable for online browsing using a pdf viewer. 
     1631# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names 
     1632# that should be included in the LaTeX output. The package can be specified just 
     1633# by its name or with the correct syntax as to be used with the LaTeX 
     1634# \usepackage command. To get the times font for instance you can specify : 
     1635# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times} 
     1636# To use the option intlimits with the amsmath package you can specify: 
     1637# EXTRA_PACKAGES=[intlimits]{amsmath} 
     1638# If left blank no extra packages will be included. 
     1639# This tag requires that the tag GENERATE_LATEX is set to YES. 
     1640 
     1641EXTRA_PACKAGES         = 
     1642 
     1643# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the 
     1644# generated LaTeX document. The header should contain everything until the first 
     1645# chapter. If it is left blank doxygen will generate a standard header. See 
     1646# section "Doxygen usage" for information on how to let doxygen write the 
     1647# default header to a separate file. 
     1648# 
     1649# Note: Only use a user-defined header if you know what you are doing! The 
     1650# following commands have a special meaning inside the header: $title, 
     1651# $datetime, $date, $doxygenversion, $projectname, $projectnumber, 
     1652# $projectbrief, $projectlogo. Doxygen will replace $title with the empty 
     1653# string, for the replacement values of the other commands the user is referred 
     1654# to HTML_HEADER. 
     1655# This tag requires that the tag GENERATE_LATEX is set to YES. 
     1656 
     1657LATEX_HEADER           = 
     1658 
     1659# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the 
     1660# generated LaTeX document. The footer should contain everything after the last 
     1661# chapter. If it is left blank doxygen will generate a standard footer. See 
     1662# LATEX_HEADER for more information on how to generate a default footer and what 
     1663# special commands can be used inside the footer. 
     1664# 
     1665# Note: Only use a user-defined footer if you know what you are doing! 
     1666# This tag requires that the tag GENERATE_LATEX is set to YES. 
     1667 
     1668LATEX_FOOTER           = 
     1669 
     1670# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined 
     1671# LaTeX style sheets that are included after the standard style sheets created 
     1672# by doxygen. Using this option one can overrule certain style aspects. Doxygen 
     1673# will copy the style sheet files to the output directory. 
     1674# Note: The order of the extra style sheet files is of importance (e.g. the last 
     1675# style sheet in the list overrules the setting of the previous ones in the 
     1676# list). 
     1677# This tag requires that the tag GENERATE_LATEX is set to YES. 
     1678 
     1679LATEX_EXTRA_STYLESHEET = 
     1680 
     1681# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or 
     1682# other source files which should be copied to the LATEX_OUTPUT output 
     1683# directory. Note that the files will be copied as-is; there are no commands or 
     1684# markers available. 
     1685# This tag requires that the tag GENERATE_LATEX is set to YES. 
     1686 
     1687LATEX_EXTRA_FILES      = 
     1688 
     1689# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is 
     1690# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will 
     1691# contain links (just like the HTML output) instead of page references. This 
     1692# makes the output suitable for online browsing using a PDF viewer. 
     1693# The default value is: YES. 
     1694# This tag requires that the tag GENERATE_LATEX is set to YES. 
    12331695 
    12341696PDF_HYPERLINKS         = YES 
    12351697 
    1236 # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of  
    1237 # plain latex in the generated Makefile. Set this option to YES to get a  
     1698# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate 
     1699# the PDF file directly from the LaTeX files. Set this option to YES, to get a 
    12381700# higher quality PDF documentation. 
     1701# The default value is: YES. 
     1702# This tag requires that the tag GENERATE_LATEX is set to YES. 
    12391703 
    12401704USE_PDFLATEX           = YES 
    12411705 
    1242 # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.  
    1243 # command to the generated LaTeX files. This will instruct LaTeX to keep  
    1244 # running if errors occur, instead of asking the user for help.  
    1245 # This option is also used when generating formulas in HTML. 
     1706# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode 
     1707# command to the generated LaTeX files. This will instruct LaTeX to keep running 
     1708# if errors occur, instead of asking the user for help. This option is also used 
     1709# when generating formulas in HTML. 
     1710# The default value is: NO. 
     1711# This tag requires that the tag GENERATE_LATEX is set to YES. 
    12461712 
    12471713LATEX_BATCHMODE        = NO 
    12481714 
    1249 # If LATEX_HIDE_INDICES is set to YES then doxygen will not  
    1250 # include the index chapters (such as File Index, Compound Index, etc.)  
    1251 # in the output. 
     1715# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the 
     1716# index chapters (such as File Index, Compound Index, etc.) in the output. 
     1717# The default value is: NO. 
     1718# This tag requires that the tag GENERATE_LATEX is set to YES. 
    12521719 
    12531720LATEX_HIDE_INDICES     = NO 
    12541721 
    1255 # If LATEX_SOURCE_CODE is set to YES then doxygen will include  
    1256 # source code with syntax highlighting in the LaTeX output.  
    1257 # Note that which sources are shown also depends on other settings  
    1258 # such as SOURCE_BROWSER. 
     1722# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source 
     1723# code with syntax highlighting in the LaTeX output. 
     1724# 
     1725# Note that which sources are shown also depends on other settings such as 
     1726# SOURCE_BROWSER. 
     1727# The default value is: NO. 
     1728# This tag requires that the tag GENERATE_LATEX is set to YES. 
    12591729 
    12601730LATEX_SOURCE_CODE      = NO 
    12611731 
    1262 #--------------------------------------------------------------------------- 
    1263 # configuration options related to the RTF output 
    1264 #--------------------------------------------------------------------------- 
    1265  
    1266 # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output  
    1267 # The RTF output is optimized for Word 97 and may not look very pretty with  
    1268 # other RTF readers or editors. 
     1732# The LATEX_BIB_STYLE tag can be used to specify the style to use for the 
     1733# bibliography, e.g. plainnat, or ieeetr. See 
     1734# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. 
     1735# The default value is: plain. 
     1736# This tag requires that the tag GENERATE_LATEX is set to YES. 
     1737 
     1738LATEX_BIB_STYLE        = plain 
     1739 
     1740#--------------------------------------------------------------------------- 
     1741# Configuration options related to the RTF output 
     1742#--------------------------------------------------------------------------- 
     1743 
     1744# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The 
     1745# RTF output is optimized for Word 97 and may not look too pretty with other RTF 
     1746# readers/editors. 
     1747# The default value is: NO. 
    12691748 
    12701749GENERATE_RTF           = NO 
    12711750 
    1272 # The RTF_OUTPUT tag is used to specify where the RTF docs will be put.  
    1273 # If a relative path is entered the value of OUTPUT_DIRECTORY will be  
    1274 # put in front of it. If left blank `rtf' will be used as the default path. 
     1751# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a 
     1752# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of 
     1753# it. 
     1754# The default directory is: rtf. 
     1755# This tag requires that the tag GENERATE_RTF is set to YES. 
    12751756 
    12761757RTF_OUTPUT             = rtf 
    12771758 
    1278 # If the COMPACT_RTF tag is set to YES Doxygen generates more compact  
    1279 # RTF documents. This may be useful for small projects and may help to  
    1280 # save some trees in general. 
     1759# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF 
     1760# documents. This may be useful for small projects and may help to save some 
     1761# trees in general. 
     1762# The default value is: NO. 
     1763# This tag requires that the tag GENERATE_RTF is set to YES. 
    12811764 
    12821765COMPACT_RTF            = NO 
    12831766 
    1284 # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated  
    1285 # will contain hyperlink fields. The RTF file will  
    1286 # contain links (just like the HTML output) instead of page references.  
    1287 # This makes the output suitable for online browsing using WORD or other  
    1288 # programs which support those fields.  
    1289 # Note: wordpad (write) and others do not support links. 
     1767# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will 
     1768# contain hyperlink fields. The RTF file will contain links (just like the HTML 
     1769# output) instead of page references. This makes the output suitable for online 
     1770# browsing using Word or some other Word compatible readers that support those 
     1771# fields. 
     1772# 
     1773# Note: WordPad (write) and others do not support links. 
     1774# The default value is: NO. 
     1775# This tag requires that the tag GENERATE_RTF is set to YES. 
    12901776 
    12911777RTF_HYPERLINKS         = NO 
    12921778 
    1293 # Load stylesheet definitions from file. Syntax is similar to doxygen's  
    1294 # config file, i.e. a series of assignments. You only have to provide  
    1295 # replacements, missing definitions are set to their default value. 
    1296  
    1297 RTF_STYLESHEET_FILE    =  
    1298  
    1299 # Set optional variables used in the generation of an rtf document.  
    1300 # Syntax is similar to doxygen's config file. 
    1301  
    1302 RTF_EXTENSIONS_FILE    =  
    1303  
    1304 #--------------------------------------------------------------------------- 
    1305 # configuration options related to the man page output 
    1306 #--------------------------------------------------------------------------- 
    1307  
    1308 # If the GENERATE_MAN tag is set to YES (the default) Doxygen will  
    1309 # generate man pages 
     1779# Load stylesheet definitions from file. Syntax is similar to doxygen's config 
     1780# file, i.e. a series of assignments. You only have to provide replacements, 
     1781# missing definitions are set to their default value. 
     1782# 
     1783# See also section "Doxygen usage" for information on how to generate the 
     1784# default style sheet that doxygen normally uses. 
     1785# This tag requires that the tag GENERATE_RTF is set to YES. 
     1786 
     1787RTF_STYLESHEET_FILE    = 
     1788 
     1789# Set optional variables used in the generation of an RTF document. Syntax is 
     1790# similar to doxygen's config file. A template extensions file can be generated 
     1791# using doxygen -e rtf extensionFile. 
     1792# This tag requires that the tag GENERATE_RTF is set to YES. 
     1793 
     1794RTF_EXTENSIONS_FILE    = 
     1795 
     1796# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code 
     1797# with syntax highlighting in the RTF output. 
     1798# 
     1799# Note that which sources are shown also depends on other settings such as 
     1800# SOURCE_BROWSER. 
     1801# The default value is: NO. 
     1802# This tag requires that the tag GENERATE_RTF is set to YES. 
     1803 
     1804RTF_SOURCE_CODE        = NO 
     1805 
     1806#--------------------------------------------------------------------------- 
     1807# Configuration options related to the man page output 
     1808#--------------------------------------------------------------------------- 
     1809 
     1810# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for 
     1811# classes and files. 
     1812# The default value is: NO. 
    13101813 
    13111814GENERATE_MAN           = NO 
    13121815 
    1313 # The MAN_OUTPUT tag is used to specify where the man pages will be put.  
    1314 # If a relative path is entered the value of OUTPUT_DIRECTORY will be  
    1315 # put in front of it. If left blank `man' will be used as the default path. 
     1816# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a 
     1817# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of 
     1818# it. A directory man3 will be created inside the directory specified by 
     1819# MAN_OUTPUT. 
     1820# The default directory is: man. 
     1821# This tag requires that the tag GENERATE_MAN is set to YES. 
    13161822 
    13171823MAN_OUTPUT             = man 
    13181824 
    1319 # The MAN_EXTENSION tag determines the extension that is added to  
    1320 # the generated man pages (default is the subroutine's section .3) 
     1825# The MAN_EXTENSION tag determines the extension that is added to the generated 
     1826# man pages. In case the manual section does not start with a number, the number 
     1827# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is 
     1828# optional. 
     1829# The default value is: .3. 
     1830# This tag requires that the tag GENERATE_MAN is set to YES. 
    13211831 
    13221832MAN_EXTENSION          = .3 
    13231833 
    1324 # If the MAN_LINKS tag is set to YES and Doxygen generates man output,  
    1325 # then it will generate one additional man file for each entity  
    1326 # documented in the real man page(s). These additional files  
    1327 # only source the real man page, but without them the man command  
    1328 # would be unable to find the correct page. The default is NO. 
     1834# The MAN_SUBDIR tag determines the name of the directory created within 
     1835# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by 
     1836# MAN_EXTENSION with the initial . removed. 
     1837# This tag requires that the tag GENERATE_MAN is set to YES. 
     1838 
     1839MAN_SUBDIR             = 
     1840 
     1841# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it 
     1842# will generate one additional man file for each entity documented in the real 
     1843# man page(s). These additional files only source the real man page, but without 
     1844# them the man command would be unable to find the correct page. 
     1845# The default value is: NO. 
     1846# This tag requires that the tag GENERATE_MAN is set to YES. 
    13291847 
    13301848MAN_LINKS              = NO 
    13311849 
    13321850#--------------------------------------------------------------------------- 
    1333 # configuration options related to the XML output 
    1334 #--------------------------------------------------------------------------- 
    1335  
    1336 # If the GENERATE_XML tag is set to YES Doxygen will  
    1337 # generate an XML file that captures the structure of  
    1338 # the code including all documentation. 
     1851# Configuration options related to the XML output 
     1852#--------------------------------------------------------------------------- 
     1853 
     1854# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that 
     1855# captures the structure of the code including all documentation. 
     1856# The default value is: NO. 
    13391857 
    13401858GENERATE_XML           = NO 
    13411859 
    1342 # The XML_OUTPUT tag is used to specify where the XML pages will be put.  
    1343 # If a relative path is entered the value of OUTPUT_DIRECTORY will be  
    1344 # put in front of it. If left blank `xml' will be used as the default path. 
     1860# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a 
     1861# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of 
     1862# it. 
     1863# The default directory is: xml. 
     1864# This tag requires that the tag GENERATE_XML is set to YES. 
    13451865 
    13461866XML_OUTPUT             = xml 
    13471867 
    1348 # The XML_SCHEMA tag can be used to specify an XML schema,  
    1349 # which can be used by a validating XML parser to check the  
    1350 # syntax of the XML files. 
    1351  
    1352 XML_SCHEMA             =  
    1353  
    1354 # The XML_DTD tag can be used to specify an XML DTD,  
    1355 # which can be used by a validating XML parser to check the  
    1356 # syntax of the XML files. 
    1357  
    1358 XML_DTD                =  
    1359  
    1360 # If the XML_PROGRAMLISTING tag is set to YES Doxygen will  
    1361 # dump the program listings (including syntax highlighting  
    1362 # and cross-referencing information) to the XML output. Note that  
    1363 # enabling this will significantly increase the size of the XML output. 
     1868# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program 
     1869# listings (including syntax highlighting and cross-referencing information) to 
     1870# the XML output. Note that enabling this will significantly increase the size 
     1871# of the XML output. 
     1872# The default value is: YES. 
     1873# This tag requires that the tag GENERATE_XML is set to YES. 
    13641874 
    13651875XML_PROGRAMLISTING     = YES 
    13661876 
    13671877#--------------------------------------------------------------------------- 
    1368 # configuration options for the AutoGen Definitions output 
    1369 #--------------------------------------------------------------------------- 
    1370  
    1371 # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will  
    1372 # generate an AutoGen Definitions (see autogen.sf.net) file  
    1373 # that captures the structure of the code including all  
    1374 # documentation. Note that this feature is still experimental  
    1375 # and incomplete at the moment. 
     1878# Configuration options related to the DOCBOOK output 
     1879#--------------------------------------------------------------------------- 
     1880 
     1881# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files 
     1882# that can be used to generate PDF. 
     1883# The default value is: NO. 
     1884 
     1885GENERATE_DOCBOOK       = NO 
     1886 
     1887# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. 
     1888# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in 
     1889# front of it. 
     1890# The default directory is: docbook. 
     1891# This tag requires that the tag GENERATE_DOCBOOK is set to YES. 
     1892 
     1893DOCBOOK_OUTPUT         = docbook 
     1894 
     1895# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the 
     1896# program listings (including syntax highlighting and cross-referencing 
     1897# information) to the DOCBOOK output. Note that enabling this will significantly 
     1898# increase the size of the DOCBOOK output. 
     1899# The default value is: NO. 
     1900# This tag requires that the tag GENERATE_DOCBOOK is set to YES. 
     1901 
     1902DOCBOOK_PROGRAMLISTING = NO 
     1903 
     1904#--------------------------------------------------------------------------- 
     1905# Configuration options for the AutoGen Definitions output 
     1906#--------------------------------------------------------------------------- 
     1907 
     1908# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an 
     1909# AutoGen Definitions (see http://autogen.sf.net) file that captures the 
     1910# structure of the code including all documentation. Note that this feature is 
     1911# still experimental and incomplete at the moment. 
     1912# The default value is: NO. 
    13761913 
    13771914GENERATE_AUTOGEN_DEF   = NO 
    13781915 
    13791916#--------------------------------------------------------------------------- 
    1380 # configuration options related to the Perl module output 
    1381 #--------------------------------------------------------------------------- 
    1382  
    1383 # If the GENERATE_PERLMOD tag is set to YES Doxygen will  
    1384 # generate a Perl module file that captures the structure of  
    1385 # the code including all documentation. Note that this  
    1386 # feature is still experimental and incomplete at the  
    1387 # moment. 
     1917# Configuration options related to the Perl module output 
     1918#--------------------------------------------------------------------------- 
     1919 
     1920# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module 
     1921# file that captures the structure of the code including all documentation. 
     1922# 
     1923# Note that this feature is still experimental and incomplete at the moment. 
     1924# The default value is: NO. 
    13881925 
    13891926GENERATE_PERLMOD       = NO 
    13901927 
    1391 # If the PERLMOD_LATEX tag is set to YES Doxygen will generate  
    1392 # the necessary Makefile rules, Perl scripts and LaTeX code to be able  
    1393 # to generate PDF and DVI output from the Perl module output. 
     1928# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary 
     1929# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI 
     1930# output from the Perl module output. 
     1931# The default value is: NO. 
     1932# This tag requires that the tag GENERATE_PERLMOD is set to YES. 
    13941933 
    13951934PERLMOD_LATEX          = NO 
    13961935 
    1397 # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be  
    1398 # nicely formatted so it can be parsed by a human reader.  This is useful  
    1399 # if you want to understand what is going on.  On the other hand, if this  
    1400 # tag is set to NO the size of the Perl module output will be much smaller  
    1401 # and Perl will parse it just the same. 
     1936# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely 
     1937# formatted so it can be parsed by a human reader. This is useful if you want to 
     1938# understand what is going on. On the other hand, if this tag is set to NO, the 
     1939# size of the Perl module output will be much smaller and Perl will parse it 
     1940# just the same. 
     1941# The default value is: YES. 
     1942# This tag requires that the tag GENERATE_PERLMOD is set to YES. 
    14021943 
    14031944PERLMOD_PRETTY         = YES 
    14041945 
    1405 # The names of the make variables in the generated doxyrules.make file  
    1406 # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.  
    1407 # This is useful so different doxyrules.make files included by the same  
    1408 # Makefile don't overwrite each other's variables. 
    1409  
    1410 PERLMOD_MAKEVAR_PREFIX =  
     1946# The names of the make variables in the generated doxyrules.make file are 
     1947# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful 
     1948# so different doxyrules.make files included by the same Makefile don't 
     1949# overwrite each other's variables. 
     1950# This tag requires that the tag GENERATE_PERLMOD is set to YES. 
     1951 
     1952PERLMOD_MAKEVAR_PREFIX = 
    14111953 
    14121954#--------------------------------------------------------------------------- 
     
    14141956#--------------------------------------------------------------------------- 
    14151957 
    1416 # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will  
    1417 # evaluate all C-preprocessor directives found in the sources and include  
     1958# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all 
     1959# C-preprocessor directives found in the sources and include files. 
     1960# The default value is: YES. 
     1961 
     1962ENABLE_PREPROCESSING   = YES 
     1963 
     1964# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names 
     1965# in the source code. If set to NO, only conditional compilation will be 
     1966# performed. Macro expansion can be done in a controlled way by setting 
     1967# EXPAND_ONLY_PREDEF to YES. 
     1968# The default value is: NO. 
     1969# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. 
     1970 
     1971MACRO_EXPANSION        = YES 
     1972 
     1973# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then 
     1974# the macro expansion is limited to the macros specified with the PREDEFINED and 
     1975# EXPAND_AS_DEFINED tags. 
     1976# The default value is: NO. 
     1977# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. 
     1978 
     1979EXPAND_ONLY_PREDEF     = NO 
     1980 
     1981# If the SEARCH_INCLUDES tag is set to YES, the include files in the 
     1982# INCLUDE_PATH will be searched if a #include is found. 
     1983# The default value is: YES. 
     1984# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. 
     1985 
     1986SEARCH_INCLUDES        = YES 
     1987 
     1988# The INCLUDE_PATH tag can be used to specify one or more directories that 
     1989# contain include files that are not input files but should be processed by the 
     1990# preprocessor. 
     1991# This tag requires that the tag SEARCH_INCLUDES is set to YES. 
     1992 
     1993INCLUDE_PATH           = 
     1994 
     1995# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
     1996# patterns (like *.h and *.hpp) to filter out the header-files in the 
     1997# directories. If left blank, the patterns specified with FILE_PATTERNS will be 
     1998# used. 
     1999# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. 
     2000 
     2001INCLUDE_FILE_PATTERNS  = 
     2002 
     2003# The PREDEFINED tag can be used to specify one or more macro names that are 
     2004# defined before the preprocessor is started (similar to the -D option of e.g. 
     2005# gcc). The argument of the tag is a list of macros of the form: name or 
     2006# name=definition (no spaces). If the definition and the "=" are omitted, "=1" 
     2007# is assumed. To prevent a macro definition from being undefined via #undef or 
     2008# recursively expanded use the := operator instead of the = operator. 
     2009# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. 
     2010 
     2011PREDEFINED             = 
     2012 
     2013# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this 
     2014# tag can be used to specify a list of macro names that should be expanded. The 
     2015# macro definition that is found in the sources will be used. Use the PREDEFINED 
     2016# tag if you want to use a different macro definition that overrules the 
     2017# definition found in the source code. 
     2018# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. 
     2019 
     2020EXPAND_AS_DEFINED      = 
     2021 
     2022# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will 
     2023# remove all references to function-like macros that are alone on a line, have 
     2024# an all uppercase name, and do not end with a semicolon. Such function macros 
     2025# are typically used for boiler-plate code, and will confuse the parser if not 
     2026# removed. 
     2027# The default value is: YES. 
     2028# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. 
     2029 
     2030SKIP_FUNCTION_MACROS   = YES 
     2031 
     2032#--------------------------------------------------------------------------- 
     2033# Configuration options related to external references 
     2034#--------------------------------------------------------------------------- 
     2035 
     2036# The TAGFILES tag can be used to specify one or more tag files. For each tag 
     2037# file the location of the external documentation should be added. The format of 
     2038# a tag file without this location is as follows: 
     2039# TAGFILES = file1 file2 ... 
     2040# Adding location for the tag files is done as follows: 
     2041# TAGFILES = file1=loc1 "file2 = loc2" ... 
     2042# where loc1 and loc2 can be relative or absolute paths or URLs. See the 
     2043# section "Linking to external documentation" for more information about the use 
     2044# of tag files. 
     2045# Note: Each tag file must have a unique name (where the name does NOT include 
     2046# the path). If a tag file is not located in the directory in which doxygen is 
     2047# run, you must also specify the path to the tagfile here. 
     2048 
     2049TAGFILES               = 
     2050 
     2051# When a file name is specified after GENERATE_TAGFILE, doxygen will create a 
     2052# tag file that is based on the input files it reads. See section "Linking to 
     2053# external documentation" for more information about the usage of tag files. 
     2054 
     2055GENERATE_TAGFILE       = 
     2056 
     2057# If the ALLEXTERNALS tag is set to YES, all external class will be listed in 
     2058# the class index. If set to NO, only the inherited external classes will be 
     2059# listed. 
     2060# The default value is: NO. 
     2061 
     2062ALLEXTERNALS           = NO 
     2063 
     2064# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed 
     2065# in the modules index. If set to NO, only the current project's groups will be 
     2066# listed. 
     2067# The default value is: YES. 
     2068 
     2069EXTERNAL_GROUPS        = YES 
     2070 
     2071# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in 
     2072# the related pages index. If set to NO, only the current project's pages will 
     2073# be listed. 
     2074# The default value is: YES. 
     2075 
     2076EXTERNAL_PAGES         = YES 
     2077 
     2078# The PERL_PATH should be the absolute path and name of the perl script 
     2079# interpreter (i.e. the result of 'which perl'). 
     2080# The default file (with absolute path) is: /usr/bin/perl. 
     2081 
     2082PERL_PATH              = /usr/bin/perl 
     2083 
     2084#--------------------------------------------------------------------------- 
     2085# Configuration options related to the dot tool 
     2086#--------------------------------------------------------------------------- 
     2087 
     2088# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram 
     2089# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to 
     2090# NO turns the diagrams off. Note that this option also works with HAVE_DOT 
     2091# disabled, but it is recommended to install and use dot, since it yields more 
     2092# powerful graphs. 
     2093# The default value is: YES. 
     2094 
     2095CLASS_DIAGRAMS         = YES 
     2096 
     2097# You can define message sequence charts within doxygen comments using the \msc 
     2098# command. Doxygen will then run the mscgen tool (see: 
     2099# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the 
     2100# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
     2101# the mscgen tool resides. If left empty the tool is assumed to be found in the 
     2102# default search path. 
     2103 
     2104MSCGEN_PATH            = 
     2105 
     2106# You can include diagrams made with dia in doxygen documentation. Doxygen will 
     2107# then run dia to produce the diagram and insert it in the documentation. The 
     2108# DIA_PATH tag allows you to specify the directory where the dia binary resides. 
     2109# If left empty dia is assumed to be found in the default search path. 
     2110 
     2111DIA_PATH               = 
     2112 
     2113# If set to YES the inheritance and collaboration graphs will hide inheritance 
     2114# and usage relations if the target is undocumented or is not a class. 
     2115# The default value is: YES. 
     2116 
     2117HIDE_UNDOC_RELATIONS   = YES 
     2118 
     2119# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
     2120# available from the path. This tool is part of Graphviz (see: 
     2121# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent 
     2122# Bell Labs. The other options in this section have no effect if this option is 
     2123# set to NO 
     2124# The default value is: NO. 
     2125 
     2126HAVE_DOT               = YES 
     2127 
     2128# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed 
     2129# to run in parallel. When set to 0 doxygen will base this on the number of 
     2130# processors available in the system. You can set it explicitly to a value 
     2131# larger than 0 to get control over the balance between CPU load and processing 
     2132# speed. 
     2133# Minimum value: 0, maximum value: 32, default value: 0. 
     2134# This tag requires that the tag HAVE_DOT is set to YES. 
     2135 
     2136DOT_NUM_THREADS        = 0 
     2137 
     2138# When you want a differently looking font in the dot files that doxygen 
     2139# generates you can specify the font name using DOT_FONTNAME. You need to make 
     2140# sure dot is able to find the font, which can be done by putting it in a 
     2141# standard location or by setting the DOTFONTPATH environment variable or by 
     2142# setting DOT_FONTPATH to the directory containing the font. 
     2143# The default value is: Helvetica. 
     2144# This tag requires that the tag HAVE_DOT is set to YES. 
     2145 
     2146DOT_FONTNAME           = Helvetica 
     2147 
     2148# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of 
     2149# dot graphs. 
     2150# Minimum value: 4, maximum value: 24, default value: 10. 
     2151# This tag requires that the tag HAVE_DOT is set to YES. 
     2152 
     2153DOT_FONTSIZE           = 10 
     2154 
     2155# By default doxygen will tell dot to use the default font as specified with 
     2156# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set 
     2157# the path where dot can find it using this tag. 
     2158# This tag requires that the tag HAVE_DOT is set to YES. 
     2159 
     2160DOT_FONTPATH           = 
     2161 
     2162# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for 
     2163# each documented class showing the direct and indirect inheritance relations. 
     2164# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. 
     2165# The default value is: YES. 
     2166# This tag requires that the tag HAVE_DOT is set to YES. 
     2167 
     2168CLASS_GRAPH            = YES 
     2169 
     2170# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a 
     2171# graph for each documented class showing the direct and indirect implementation 
     2172# dependencies (inheritance, containment, and class references variables) of the 
     2173# class with other documented classes. 
     2174# The default value is: YES. 
     2175# This tag requires that the tag HAVE_DOT is set to YES. 
     2176 
     2177COLLABORATION_GRAPH    = YES 
     2178 
     2179# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for 
     2180# groups, showing the direct groups dependencies. 
     2181# The default value is: YES. 
     2182# This tag requires that the tag HAVE_DOT is set to YES. 
     2183 
     2184GROUP_GRAPHS           = YES 
     2185 
     2186# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and 
     2187# collaboration diagrams in a style similar to the OMG's Unified Modeling 
     2188# Language. 
     2189# The default value is: NO. 
     2190# This tag requires that the tag HAVE_DOT is set to YES. 
     2191 
     2192UML_LOOK               = YES 
     2193 
     2194# If the UML_LOOK tag is enabled, the fields and methods are shown inside the 
     2195# class node. If there are many fields or methods and many nodes the graph may 
     2196# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the 
     2197# number of items for each type to make the size more manageable. Set this to 0 
     2198# for no limit. Note that the threshold may be exceeded by 50% before the limit 
     2199# is enforced. So when you set the threshold to 10, up to 15 fields may appear, 
     2200# but if the number exceeds 15, the total amount of fields shown is limited to 
     2201# 10. 
     2202# Minimum value: 0, maximum value: 100, default value: 10. 
     2203# This tag requires that the tag HAVE_DOT is set to YES. 
     2204 
     2205UML_LIMIT_NUM_FIELDS   = 10 
     2206 
     2207# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and 
     2208# collaboration graphs will show the relations between templates and their 
     2209# instances. 
     2210# The default value is: NO. 
     2211# This tag requires that the tag HAVE_DOT is set to YES. 
     2212 
     2213TEMPLATE_RELATIONS     = YES 
     2214 
     2215# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to 
     2216# YES then doxygen will generate a graph for each documented file showing the 
     2217# direct and indirect include dependencies of the file with other documented 
    14182218# files. 
    1419  
    1420 ENABLE_PREPROCESSING   = YES 
    1421  
    1422 # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro  
    1423 # names in the source code. If set to NO (the default) only conditional  
    1424 # compilation will be performed. Macro expansion can be done in a controlled  
    1425 # way by setting EXPAND_ONLY_PREDEF to YES. 
    1426  
    1427 MACRO_EXPANSION        = YES 
    1428  
    1429 # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES  
    1430 # then the macro expansion is limited to the macros specified with the  
    1431 # PREDEFINED and EXPAND_AS_DEFINED tags. 
    1432  
    1433 EXPAND_ONLY_PREDEF     = NO 
    1434  
    1435 # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files  
    1436 # pointed to by INCLUDE_PATH will be searched when a #include is found. 
    1437  
    1438 SEARCH_INCLUDES        = YES 
    1439  
    1440 # The INCLUDE_PATH tag can be used to specify one or more directories that  
    1441 # contain include files that are not input files but should be processed by  
    1442 # the preprocessor. 
    1443  
    1444 INCLUDE_PATH           =  
    1445  
    1446 # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard  
    1447 # patterns (like *.h and *.hpp) to filter out the header-files in the  
    1448 # directories. If left blank, the patterns specified with FILE_PATTERNS will  
    1449 # be used. 
    1450  
    1451 INCLUDE_FILE_PATTERNS  =  
    1452  
    1453 # The PREDEFINED tag can be used to specify one or more macro names that  
    1454 # are defined before the preprocessor is started (similar to the -D option of  
    1455 # gcc). The argument of the tag is a list of macros of the form: name  
    1456 # or name=definition (no spaces). If the definition and the = are  
    1457 # omitted =1 is assumed. To prevent a macro definition from being  
    1458 # undefined via #undef or recursively expanded use the := operator  
    1459 # instead of the = operator. 
    1460  
    1461 PREDEFINED             =  
    1462  
    1463 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then  
    1464 # this tag can be used to specify a list of macro names that should be expanded.  
    1465 # The macro definition that is found in the sources will be used.  
    1466 # Use the PREDEFINED tag if you want to use a different macro definition that  
    1467 # overrules the definition found in the source code. 
    1468  
    1469 EXPAND_AS_DEFINED      =  
    1470  
    1471 # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then  
    1472 # doxygen's preprocessor will remove all references to function-like macros  
    1473 # that are alone on a line, have an all uppercase name, and do not end with a  
    1474 # semicolon, because these will confuse the parser if not removed. 
    1475  
    1476 SKIP_FUNCTION_MACROS   = YES 
    1477  
    1478 #--------------------------------------------------------------------------- 
    1479 # Configuration::additions related to external references 
    1480 #--------------------------------------------------------------------------- 
    1481  
    1482 # The TAGFILES option can be used to specify one or more tagfiles.  
    1483 # Optionally an initial location of the external documentation  
    1484 # can be added for each tagfile. The format of a tag file without  
    1485 # this location is as follows:  
    1486 #   TAGFILES = file1 file2 ...  
    1487 # Adding location for the tag files is done as follows:  
    1488 #   TAGFILES = file1=loc1 "file2 = loc2" ...  
    1489 # where "loc1" and "loc2" can be relative or absolute paths or  
    1490 # URLs. If a location is present for each tag, the installdox tool  
    1491 # does not have to be run to correct the links.  
    1492 # Note that each tag file must have a unique name  
    1493 # (where the name does NOT include the path)  
    1494 # If a tag file is not located in the directory in which doxygen  
    1495 # is run, you must also specify the path to the tagfile here. 
    1496  
    1497 TAGFILES               =  
    1498  
    1499 # When a file name is specified after GENERATE_TAGFILE, doxygen will create  
    1500 # a tag file that is based on the input files it reads. 
    1501  
    1502 GENERATE_TAGFILE       =  
    1503  
    1504 # If the ALLEXTERNALS tag is set to YES all external classes will be listed  
    1505 # in the class index. If set to NO only the inherited external classes  
    1506 # will be listed. 
    1507  
    1508 ALLEXTERNALS           = NO 
    1509  
    1510 # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed  
    1511 # in the modules index. If set to NO, only the current project's groups will  
    1512 # be listed. 
    1513  
    1514 EXTERNAL_GROUPS        = YES 
    1515  
    1516 # The PERL_PATH should be the absolute path and name of the perl script  
    1517 # interpreter (i.e. the result of `which perl'). 
    1518  
    1519 PERL_PATH              = /usr/bin/perl 
    1520  
    1521 #--------------------------------------------------------------------------- 
    1522 # Configuration options related to the dot tool 
    1523 #--------------------------------------------------------------------------- 
    1524  
    1525 # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will  
    1526 # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base  
    1527 # or super classes. Setting the tag to NO turns the diagrams off. Note that  
    1528 # this option also works with HAVE_DOT disabled, but it is recommended to  
    1529 # install and use dot, since it yields more powerful graphs. 
    1530  
    1531 CLASS_DIAGRAMS         = YES 
    1532  
    1533 # You can define message sequence charts within doxygen comments using the \msc  
    1534 # command. Doxygen will then run the mscgen tool (see  
    1535 # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the  
    1536 # documentation. The MSCGEN_PATH tag allows you to specify the directory where  
    1537 # the mscgen tool resides. If left empty the tool is assumed to be found in the  
    1538 # default search path. 
    1539  
    1540 MSCGEN_PATH            =  
    1541  
    1542 # If set to YES, the inheritance and collaboration graphs will hide  
    1543 # inheritance and usage relations if the target is undocumented  
    1544 # or is not a class. 
    1545  
    1546 HIDE_UNDOC_RELATIONS   = YES 
    1547  
    1548 # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is  
    1549 # available from the path. This tool is part of Graphviz, a graph visualization  
    1550 # toolkit from AT&T and Lucent Bell Labs. The other options in this section  
    1551 # have no effect if this option is set to NO (the default) 
    1552  
    1553 HAVE_DOT               = YES 
    1554  
    1555 # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is  
    1556 # allowed to run in parallel. When set to 0 (the default) doxygen will  
    1557 # base this on the number of processors available in the system. You can set it  
    1558 # explicitly to a value larger than 0 to get control over the balance  
    1559 # between CPU load and processing speed. 
    1560  
    1561 DOT_NUM_THREADS        = 0 
    1562  
    1563 # By default doxygen will write a font called Helvetica to the output  
    1564 # directory and reference it in all dot files that doxygen generates.  
    1565 # When you want a differently looking font you can specify the font name  
    1566 # using DOT_FONTNAME. You need to make sure dot is able to find the font,  
    1567 # which can be done by putting it in a standard location or by setting the  
    1568 # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory  
    1569 # containing the font. 
    1570  
    1571 DOT_FONTNAME           = Helvetica 
    1572  
    1573 # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.  
    1574 # The default size is 10pt. 
    1575  
    1576 DOT_FONTSIZE           = 10 
    1577  
    1578 # By default doxygen will tell dot to use the output directory to look for the  
    1579 # FreeSans.ttf font (which doxygen will put there itself). If you specify a  
    1580 # different font using DOT_FONTNAME you can set the path where dot  
    1581 # can find it using this tag. 
    1582  
    1583 DOT_FONTPATH           =  
    1584  
    1585 # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen  
    1586 # will generate a graph for each documented class showing the direct and  
    1587 # indirect inheritance relations. Setting this tag to YES will force the  
    1588 # the CLASS_DIAGRAMS tag to NO. 
    1589  
    1590 CLASS_GRAPH            = YES 
    1591  
    1592 # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen  
    1593 # will generate a graph for each documented class showing the direct and  
    1594 # indirect implementation dependencies (inheritance, containment, and  
    1595 # class references variables) of the class with other documented classes. 
    1596  
    1597 COLLABORATION_GRAPH    = YES 
    1598  
    1599 # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen  
    1600 # will generate a graph for groups, showing the direct groups dependencies 
    1601  
    1602 GROUP_GRAPHS           = YES 
    1603  
    1604 # If the UML_LOOK tag is set to YES doxygen will generate inheritance and  
    1605 # collaboration diagrams in a style similar to the OMG's Unified Modeling  
    1606 # Language. 
    1607  
    1608 UML_LOOK               = YES 
    1609  
    1610 # If set to YES, the inheritance and collaboration graphs will show the  
    1611 # relations between templates and their instances. 
    1612  
    1613 TEMPLATE_RELATIONS     = YES 
    1614  
    1615 # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT  
    1616 # tags are set to YES then doxygen will generate a graph for each documented  
    1617 # file showing the direct and indirect include dependencies of the file with  
    1618 # other documented files. 
     2219# The default value is: YES. 
     2220# This tag requires that the tag HAVE_DOT is set to YES. 
    16192221 
    16202222INCLUDE_GRAPH          = YES 
    16212223 
    1622 # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and  
    1623 # HAVE_DOT tags are set to YES then doxygen will generate a graph for each  
    1624 # documented header file showing the documented files that directly or  
    1625 # indirectly include this file. 
     2224# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are 
     2225# set to YES then doxygen will generate a graph for each documented file showing 
     2226# the direct and indirect include dependencies of the file with other documented 
     2227# files. 
     2228# The default value is: YES. 
     2229# This tag requires that the tag HAVE_DOT is set to YES. 
    16262230 
    16272231INCLUDED_BY_GRAPH      = YES 
    16282232 
    1629 # If the CALL_GRAPH and HAVE_DOT options are set to YES then  
    1630 # doxygen will generate a call dependency graph for every global function  
    1631 # or class method. Note that enabling this option will significantly increase  
    1632 # the time of a run. So in most cases it will be better to enable call graphs  
    1633 # for selected functions only using the \callgraph command. 
     2233# If the CALL_GRAPH tag is set to YES then doxygen will generate a call 
     2234# dependency graph for every global function or class method. 
     2235# 
     2236# Note that enabling this option will significantly increase the time of a run. 
     2237# So in most cases it will be better to enable call graphs for selected 
     2238# functions only using the \callgraph command. Disabling a call graph can be 
     2239# accomplished by means of the command \hidecallgraph. 
     2240# The default value is: NO. 
     2241# This tag requires that the tag HAVE_DOT is set to YES. 
    16342242 
    16352243CALL_GRAPH             = YES 
    16362244 
    1637 # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then  
    1638 # doxygen will generate a caller dependency graph for every global function  
    1639 # or class method. Note that enabling this option will significantly increase  
    1640 # the time of a run. So in most cases it will be better to enable caller  
    1641 # graphs for selected functions only using the \callergraph command. 
     2245# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller 
     2246# dependency graph for every global function or class method. 
     2247# 
     2248# Note that enabling this option will significantly increase the time of a run. 
     2249# So in most cases it will be better to enable caller graphs for selected 
     2250# functions only using the \callergraph command. Disabling a caller graph can be 
     2251# accomplished by means of the command \hidecallergraph. 
     2252# The default value is: NO. 
     2253# This tag requires that the tag HAVE_DOT is set to YES. 
    16422254 
    16432255CALLER_GRAPH           = YES 
    16442256 
    1645 # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen  
    1646 # will generate a graphical hierarchy of all classes instead of a textual one. 
     2257# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical 
     2258# hierarchy of all classes instead of a textual one. 
     2259# The default value is: YES. 
     2260# This tag requires that the tag HAVE_DOT is set to YES. 
    16472261 
    16482262GRAPHICAL_HIERARCHY    = YES 
    16492263 
    1650 # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES  
    1651 # then doxygen will show the dependencies a directory has on other directories  
    1652 # in a graphical way. The dependency relations are determined by the #include  
    1653 # relations between the files in the directories. 
     2264# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the 
     2265# dependencies a directory has on other directories in a graphical way. The 
     2266# dependency relations are determined by the #include relations between the 
     2267# files in the directories. 
     2268# The default value is: YES. 
     2269# This tag requires that the tag HAVE_DOT is set to YES. 
    16542270 
    16552271DIRECTORY_GRAPH        = YES 
    16562272 
    1657 # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images  
    1658 # generated by dot. Possible values are svg, png, jpg, or gif.  
    1659 # If left blank png will be used. 
     2273# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
     2274# generated by dot. For an explanation of the image formats see the section 
     2275# output formats in the documentation of the dot tool (Graphviz (see: 
     2276# http://www.graphviz.org/)). 
     2277# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order 
     2278# to make the SVG files visible in IE 9+ (other browsers do not have this 
     2279# requirement). 
     2280# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, 
     2281# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and 
     2282# png:gdiplus:gdiplus. 
     2283# The default value is: png. 
     2284# This tag requires that the tag HAVE_DOT is set to YES. 
    16602285 
    16612286DOT_IMAGE_FORMAT       = png 
    16622287 
    1663 # The tag DOT_PATH can be used to specify the path where the dot tool can be  
     2288# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to 
     2289# enable generation of interactive SVG images that allow zooming and panning. 
     2290# 
     2291# Note that this requires a modern browser other than Internet Explorer. Tested 
     2292# and working are Firefox, Chrome, Safari, and Opera. 
     2293# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make 
     2294# the SVG files visible. Older versions of IE do not have SVG support. 
     2295# The default value is: NO. 
     2296# This tag requires that the tag HAVE_DOT is set to YES. 
     2297 
     2298INTERACTIVE_SVG        = NO 
     2299 
     2300# The DOT_PATH tag can be used to specify the path where the dot tool can be 
    16642301# found. If left blank, it is assumed the dot tool can be found in the path. 
    1665  
    1666 DOT_PATH               =  
    1667  
    1668 # The DOTFILE_DIRS tag can be used to specify one or more directories that  
    1669 # contain dot files that are included in the documentation (see the  
    1670 # \dotfile command). 
    1671  
    1672 DOTFILE_DIRS           =  
    1673  
    1674 # The MSCFILE_DIRS tag can be used to specify one or more directories that  
    1675 # contain msc files that are included in the documentation (see the  
    1676 # \mscfile command). 
    1677  
    1678 MSCFILE_DIRS           =  
    1679  
    1680 # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of  
    1681 # nodes that will be shown in the graph. If the number of nodes in a graph  
    1682 # becomes larger than this value, doxygen will truncate the graph, which is  
    1683 # visualized by representing a node as a red box. Note that doxygen if the  
    1684 # number of direct children of the root node in a graph is already larger than  
    1685 # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note  
    1686 # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. 
     2302# This tag requires that the tag HAVE_DOT is set to YES. 
     2303 
     2304DOT_PATH               = 
     2305 
     2306# The DOTFILE_DIRS tag can be used to specify one or more directories that 
     2307# contain dot files that are included in the documentation (see the \dotfile 
     2308# command). 
     2309# This tag requires that the tag HAVE_DOT is set to YES. 
     2310 
     2311DOTFILE_DIRS           = 
     2312 
     2313# The MSCFILE_DIRS tag can be used to specify one or more directories that 
     2314# contain msc files that are included in the documentation (see the \mscfile 
     2315# command). 
     2316 
     2317MSCFILE_DIRS           = 
     2318 
     2319# The DIAFILE_DIRS tag can be used to specify one or more directories that 
     2320# contain dia files that are included in the documentation (see the \diafile 
     2321# command). 
     2322 
     2323DIAFILE_DIRS           = 
     2324 
     2325# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the 
     2326# path where java can find the plantuml.jar file. If left blank, it is assumed 
     2327# PlantUML is not used or called during a preprocessing step. Doxygen will 
     2328# generate a warning when it encounters a \startuml command in this case and 
     2329# will not generate output for the diagram. 
     2330 
     2331PLANTUML_JAR_PATH      = 
     2332 
     2333# When using plantuml, the specified paths are searched for files specified by 
     2334# the !include statement in a plantuml block. 
     2335 
     2336PLANTUML_INCLUDE_PATH  = 
     2337 
     2338# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes 
     2339# that will be shown in the graph. If the number of nodes in a graph becomes 
     2340# larger than this value, doxygen will truncate the graph, which is visualized 
     2341# by representing a node as a red box. Note that doxygen if the number of direct 
     2342# children of the root node in a graph is already larger than 
     2343# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that 
     2344# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. 
     2345# Minimum value: 0, maximum value: 10000, default value: 50. 
     2346# This tag requires that the tag HAVE_DOT is set to YES. 
    16872347 
    16882348DOT_GRAPH_MAX_NODES    = 50 
    16892349 
    1690 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the  
    1691 # graphs generated by dot. A depth value of 3 means that only nodes reachable  
    1692 # from the root by following a path via at most 3 edges will be shown. Nodes  
    1693 # that lay further from the root node will be omitted. Note that setting this  
    1694 # option to 1 or 2 may greatly reduce the computation time needed for large  
    1695 # code bases. Also note that the size of a graph can be further restricted by  
     2350# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs 
     2351# generated by dot. A depth value of 3 means that only nodes reachable from the 
     2352# root by following a path via at most 3 edges will be shown. Nodes that lay 
     2353# further from the root node will be omitted. Note that setting this option to 1 
     2354# or 2 may greatly reduce the computation time needed for large code bases. Also 
     2355# note that the size of a graph can be further restricted by 
    16962356# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. 
     2357# Minimum value: 0, maximum value: 1000, default value: 0. 
     2358# This tag requires that the tag HAVE_DOT is set to YES. 
    16972359 
    16982360MAX_DOT_GRAPH_DEPTH    = 0 
    16992361 
    1700 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent  
    1701 # background. This is disabled by default, because dot on Windows does not  
    1702 # seem to support this out of the box. Warning: Depending on the platform used,  
    1703 # enabling this option may lead to badly anti-aliased labels on the edges of  
    1704 # a graph (i.e. they become hard to read). 
     2362# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
     2363# background. This is disabled by default, because dot on Windows does not seem 
     2364# to support this out of the box. 
     2365# 
     2366# Warning: Depending on the platform used, enabling this option may lead to 
     2367# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
     2368# read). 
     2369# The default value is: NO. 
     2370# This tag requires that the tag HAVE_DOT is set to YES. 
    17052371 
    17062372DOT_TRANSPARENT        = NO 
    17072373 
    1708 # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output  
    1709 # files in one run (i.e. multiple -o and -T options on the command line). This  
    1710 # makes dot run faster, but since only newer versions of dot (>1.8.10)  
    1711 # support this, this feature is disabled by default. 
     2374# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output 
     2375# files in one run (i.e. multiple -o and -T options on the command line). This 
     2376# makes dot run faster, but since only newer versions of dot (>1.8.10) support 
     2377# this, this feature is disabled by default. 
     2378# The default value is: NO. 
     2379# This tag requires that the tag HAVE_DOT is set to YES. 
    17122380 
    17132381DOT_MULTI_TARGETS      = NO 
    17142382 
    1715 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will  
    1716 # generate a legend page explaining the meaning of the various boxes and  
    1717 # arrows in the dot generated graphs. 
     2383# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page 
     2384# explaining the meaning of the various boxes and arrows in the dot generated 
     2385# graphs. 
     2386# The default value is: YES. 
     2387# This tag requires that the tag HAVE_DOT is set to YES. 
    17182388 
    17192389GENERATE_LEGEND        = YES 
    17202390 
    1721 # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will  
    1722 # remove the intermediate dot files that are used to generate  
    1723 # the various graphs. 
     2391# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot 
     2392# files that are used to generate the various graphs. 
     2393# The default value is: YES. 
     2394# This tag requires that the tag HAVE_DOT is set to YES. 
    17242395 
    17252396DOT_CLEANUP            = YES 
  • XIOS/dev/branch_yushan_merged/bld.cfg

    r1134 r1138  
    3333#bld::target libxios.a  
    3434#bld::target generate_fortran_interface.exe  
    35 #bld::target xios_server.exe  
    36 #bld::target test_remap.exe 
     35bld::target xios_server.exe  
     36bld::target test_remap.exe 
    3737#bld::target test_regular.exe 
    3838#bld::target test_expand_domain.exe 
    3939#bld::target test_new_features.exe test_unstruct_complete.exe  
    4040bld::target test_omp.exe test_complete_omp.exe 
    41 bld::target test_client.exe test_complete.exe test_xios2_cmip6.exe 
     41bld::target test_client.exe test_complete.exe #test_xios2_cmip6.exe 
    4242#bld::target test_connectivity_expand.exe 
    4343#bld::target toy_cmip6.exe 
  • XIOS/dev/branch_yushan_merged/extern/remap/src/mapper.cpp

    r1134 r1138  
    6565void Mapper::setTargetMesh(const double* boundsLon, const double* boundsLat, int nVertex, int nbCells, const double* pole, const long int* globalId) 
    6666{ 
    67   tgtGrid.pole = Coord(pole[0], pole[1], pole[2]); 
    68  
    69         int mpiRank, mpiSize; 
    70         MPI_Comm_rank(communicator, &mpiRank); 
    71         MPI_Comm_size(communicator, &mpiSize); 
    72  
    73         targetElements.reserve(nbCells); 
    74         targetMesh.reserve(nbCells); 
    75  
    76   targetGlobalId.resize(nbCells) ; 
    77   if (globalId==NULL) 
    78   { 
    79     long int offset ; 
    80     long int nb=nbCells ; 
    81     MPI_Scan(&nb,&offset,1,MPI_LONG,MPI_SUM,communicator) ; 
    82     offset=offset-nb ; 
    83     for(int i=0;i<nbCells;i++) targetGlobalId[i]=offset+i ; 
    84   } 
    85   else targetGlobalId.assign(globalId,globalId+nbCells); 
    86  
    87         for (int i = 0; i < nbCells; i++) 
    88         { 
    89                 int offs = i*nVertex; 
    90                 Elt elt(boundsLon + offs, boundsLat + offs, nVertex); 
    91                 targetElements.push_back(elt); 
    92                 targetMesh.push_back(Node(elt.x, cptRadius(elt), &sourceElements.back())); 
    93                 cptEltGeom(targetElements[i], Coord(pole[0], pole[1], pole[2])); 
    94         } 
     67    tgtGrid.pole = Coord(pole[0], pole[1], pole[2]); 
     68 
     69    int mpiRank, mpiSize; 
     70    MPI_Comm_rank(communicator, &mpiRank); 
     71    MPI_Comm_size(communicator, &mpiSize); 
     72 
     73    targetElements.reserve(nbCells); 
     74    targetMesh.reserve(nbCells); 
     75 
     76    targetGlobalId.resize(nbCells) ; 
     77    if (globalId==NULL) 
     78    { 
     79        long int offset ; 
     80        long int nb=nbCells ; 
     81        MPI_Scan(&nb,&offset,1,MPI_LONG,MPI_SUM,communicator) ; 
     82        offset=offset-nb ; 
     83        for(int i=0;i<nbCells;i++) targetGlobalId[i]=offset+i ; 
     84    } 
     85    else targetGlobalId.assign(globalId,globalId+nbCells); 
     86 
     87    for (int i = 0; i < nbCells; i++) 
     88    { 
     89        int offs = i*nVertex; 
     90        Elt elt(boundsLon + offs, boundsLat + offs, nVertex); 
     91        targetElements.push_back(elt); 
     92        targetMesh.push_back(Node(elt.x, cptRadius(elt), &sourceElements.back())); 
     93        cptEltGeom(targetElements[i], Coord(pole[0], pole[1], pole[2])); 
     94    } 
    9595 
    9696 
     
    9999void Mapper::setSourceValue(const double* val) 
    100100{ 
    101   int size=sourceElements.size() ; 
    102   for(int i=0;i<size;++i) sourceElements[i].val=val[i] ; 
     101    int size=sourceElements.size() ; 
     102    for(int i=0;i<size;++i) sourceElements[i].val=val[i] ; 
    103103} 
    104104 
    105105void Mapper::getTargetValue(double* val) 
    106106{ 
    107   int size=targetElements.size() ; 
    108   for(int i=0;i<size;++i) val[i]=targetElements[i].val ; 
     107    int size=targetElements.size() ; 
     108    for(int i=0;i<size;++i) val[i]=targetElements[i].val ; 
    109109} 
    110110 
    111111vector<double> Mapper::computeWeights(int interpOrder, bool renormalize, bool quantity) 
    112112{ 
    113         vector<double> timings; 
    114         int mpiSize, mpiRank; 
    115         MPI_Comm_size(communicator, &mpiSize); 
    116         MPI_Comm_rank(communicator, &mpiRank); 
    117  
    118   this->buildSSTree(sourceMesh, targetMesh); 
    119  
    120         if (mpiRank == 0 && verbose) cout << "Computing intersections ..." << endl; 
    121         double tic = cputime(); 
    122         computeIntersection(&targetElements[0], targetElements.size()); 
    123         timings.push_back(cputime() - tic); 
    124  
    125         tic = cputime(); 
    126         if (interpOrder == 2) { 
    127                 if (mpiRank == 0 && verbose) cout << "Computing grads ..." << endl; 
    128                 buildMeshTopology(); 
    129                 computeGrads(); 
    130         } 
    131         timings.push_back(cputime() - tic); 
    132  
    133         /* Prepare computation of weights */ 
    134         /* compute number of intersections which for the first order case 
    135            corresponds to the number of edges in the remap matrix */ 
    136         int nIntersections = 0; 
    137         for (int j = 0; j < targetElements.size(); j++) 
    138         { 
    139                 Elt &elt = targetElements[j]; 
    140                 for (list<Polyg*>::iterator it = elt.is.begin(); it != elt.is.end(); it++) 
    141                         nIntersections++; 
    142         } 
    143         /* overallocate for NMAX neighbours for each elements */ 
    144         remapMatrix = new double[nIntersections*NMAX]; 
    145         srcAddress = new int[nIntersections*NMAX]; 
    146         srcRank = new int[nIntersections*NMAX]; 
    147         dstAddress = new int[nIntersections*NMAX]; 
    148   sourceWeightId =new long[nIntersections*NMAX]; 
    149   targetWeightId =new long[nIntersections*NMAX]; 
    150  
    151  
    152         if (mpiRank == 0 && verbose) cout << "Remapping..." << endl; 
    153         tic = cputime(); 
    154         nWeights = remap(&targetElements[0], targetElements.size(), interpOrder, renormalize, quantity); 
    155         timings.push_back(cputime() - tic); 
    156  
    157   for (int i = 0; i < targetElements.size(); i++) targetElements[i].delete_intersections(); 
    158  
    159         return timings; 
     113    vector<double> timings; 
     114    int mpiSize, mpiRank; 
     115    MPI_Comm_size(communicator, &mpiSize); 
     116    MPI_Comm_rank(communicator, &mpiRank); 
     117 
     118    this->buildSSTree(sourceMesh, targetMesh); 
     119 
     120    if (mpiRank == 0 && verbose) cout << "Computing intersections ..." << endl; 
     121    double tic = cputime(); 
     122    computeIntersection(&targetElements[0], targetElements.size()); 
     123    timings.push_back(cputime() - tic); 
     124 
     125    tic = cputime(); 
     126    if (interpOrder == 2) { 
     127        if (mpiRank == 0 && verbose) cout << "Computing grads ..." << endl; 
     128        buildMeshTopology(); 
     129        computeGrads(); 
     130    } 
     131    timings.push_back(cputime() - tic); 
     132 
     133    /* Prepare computation of weights */ 
     134    /* compute number of intersections which for the first order case 
     135       corresponds to the number of edges in the remap matrix */ 
     136    int nIntersections = 0; 
     137    for (int j = 0; j < targetElements.size(); j++) 
     138    { 
     139        Elt &elt = targetElements[j]; 
     140        for (list<Polyg*>::iterator it = elt.is.begin(); it != elt.is.end(); it++) 
     141            nIntersections++; 
     142    } 
     143    /* overallocate for NMAX neighbours for each elements */ 
     144    remapMatrix = new double[nIntersections*NMAX]; 
     145    srcAddress = new int[nIntersections*NMAX]; 
     146    srcRank = new int[nIntersections*NMAX]; 
     147    dstAddress = new int[nIntersections*NMAX]; 
     148    sourceWeightId =new long[nIntersections*NMAX]; 
     149    targetWeightId =new long[nIntersections*NMAX]; 
     150 
     151 
     152    if (mpiRank == 0 && verbose) cout << "Remapping..." << endl; 
     153    tic = cputime(); 
     154    nWeights = remap(&targetElements[0], targetElements.size(), interpOrder, renormalize, quantity); 
     155    timings.push_back(cputime() - tic); 
     156 
     157    for (int i = 0; i < targetElements.size(); i++) targetElements[i].delete_intersections(); 
     158 
     159    return timings; 
    160160} 
    161161 
    162162/** 
    163    @param elements are cells of the target grid that are distributed over CPUs 
    164           indepentently of the distribution of the SS-tree. 
    165    @param nbElements is the size of the elements array. 
    166    @param order is the order of interpolaton (must be 1 or 2). 
    167 */ 
     163  @param elements are cells of the target grid that are distributed over CPUs 
     164  indepentently of the distribution of the SS-tree. 
     165  @param nbElements is the size of the elements array. 
     166  @param order is the order of interpolaton (must be 1 or 2). 
     167  */ 
    168168int Mapper::remap(Elt *elements, int nbElements, int order, bool renormalize, bool quantity) 
    169169{ 
    170         int mpiSize, mpiRank; 
    171         MPI_Comm_size(communicator, &mpiSize); 
    172         MPI_Comm_rank(communicator, &mpiRank); 
    173  
    174         /* create list of intersections (super mesh elements) for each rank */ 
    175         multimap<int, Polyg *> *elementList = new multimap<int, Polyg *>[mpiSize]; 
    176         for (int j = 0; j < nbElements; j++) 
    177         { 
    178                 Elt& e = elements[j]; 
    179                 for (list<Polyg *>::iterator it = e.is.begin(); it != e.is.end(); it++) 
    180                         elementList[(*it)->id.rank].insert(pair<int, Polyg *>((*it)->id.ind, *it)); 
    181         } 
    182  
    183         int *nbSendElement = new int[mpiSize]; 
    184         int **sendElement = new int*[mpiSize]; /* indices of elements required from other rank */ 
    185         double **recvValue = new double*[mpiSize]; 
    186         double **recvArea = new double*[mpiSize]; 
    187         Coord **recvGrad = new Coord*[mpiSize]; 
    188         GloId **recvNeighIds = new GloId*[mpiSize]; /* ids of the of the source neighbours which also contribute through gradient */ 
    189         for (int rank = 0; rank < mpiSize; rank++) 
    190         { 
    191                 /* get size for allocation */ 
    192                 int last = -1; /* compares unequal to any index */ 
    193                 int index = -1; /* increased to starting index 0 in first iteration */ 
    194                 for (multimap<int, Polyg *>::iterator it = elementList[rank].begin(); it != elementList[rank].end(); ++it) 
    195                 { 
    196                         if (last != it->first) 
    197                                 index++; 
    198                         (it->second)->id.ind = index; 
    199                         last = it->first; 
    200                 } 
    201                 nbSendElement[rank] = index + 1; 
    202  
    203                 /* if size is non-zero allocate and collect indices of elements on other ranks that we intersect */ 
    204                 if (nbSendElement[rank] > 0) 
    205                 { 
    206                         sendElement[rank] = new int[nbSendElement[rank]]; 
    207                         recvValue[rank]   = new double[nbSendElement[rank]]; 
    208                         recvArea[rank]    = new double[nbSendElement[rank]]; 
    209                         if (order == 2) 
    210                         { 
    211                                 recvNeighIds[rank] = new GloId[nbSendElement[rank]*(NMAX+1)]; 
    212                                 recvGrad[rank]    = new Coord[nbSendElement[rank]*(NMAX+1)]; 
    213                         } 
    214                         else 
    215                                 recvNeighIds[rank] = new GloId[nbSendElement[rank]]; 
    216  
    217                         last = -1; 
    218                         index = -1; 
    219                         for (multimap<int, Polyg *>::iterator it = elementList[rank].begin(); it != elementList[rank].end(); ++it) 
    220                         { 
    221                                 if (last != it->first) 
    222                                         index++; 
    223                                 sendElement[rank][index] = it->first; 
    224                                 last = it->first; 
    225                         } 
    226                 } 
    227         } 
    228  
    229         /* communicate sizes of source elements to be sent (index lists and later values and gradients) */ 
    230         int *nbRecvElement = new int[mpiSize]; 
    231         MPI_Alltoall(nbSendElement, 1, MPI_INT, nbRecvElement, 1, MPI_INT, communicator); 
    232  
    233         /* communicate indices of source elements on other ranks whoes value and gradient we need (since intersection) */ 
    234         int nbSendRequest = 0; 
    235         int nbRecvRequest = 0; 
    236         int **recvElement = new int*[mpiSize]; 
    237         double **sendValue = new double*[mpiSize]; 
    238         double **sendArea = new double*[mpiSize]; 
    239         Coord **sendGrad = new Coord*[mpiSize]; 
    240         GloId **sendNeighIds = new GloId*[mpiSize]; 
    241         MPI_Request *sendRequest = new MPI_Request[3*mpiSize]; 
    242         MPI_Request *recvRequest = new MPI_Request[3*mpiSize]; 
    243         for (int rank = 0; rank < mpiSize; rank++) 
    244         { 
    245                 if (nbSendElement[rank] > 0) 
    246                 { 
    247                         MPI_Issend(sendElement[rank], nbSendElement[rank], MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    248                         nbSendRequest++; 
    249                 } 
    250  
    251                 if (nbRecvElement[rank] > 0) 
    252                 { 
    253                         recvElement[rank] = new int[nbRecvElement[rank]]; 
    254                         sendValue[rank]   = new double[nbRecvElement[rank]]; 
    255                         sendArea[rank]   = new double[nbRecvElement[rank]]; 
    256                         if (order == 2) 
    257                         { 
    258                                 sendNeighIds[rank] = new GloId[nbRecvElement[rank]*(NMAX+1)]; 
    259                                 sendGrad[rank]    = new Coord[nbRecvElement[rank]*(NMAX+1)]; 
    260                         } 
    261                         else 
    262                         { 
    263                                 sendNeighIds[rank] = new GloId[nbRecvElement[rank]]; 
    264                         } 
    265                         MPI_Irecv(recvElement[rank], nbRecvElement[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    266                         nbRecvRequest++; 
    267                 } 
    268         } 
    269         MPI_Status *status = new MPI_Status[3*mpiSize]; 
    270         MPI_Waitall(nbRecvRequest, recvRequest, status); 
    271         MPI_Waitall(nbSendRequest, sendRequest, status); 
    272  
    273         /* for all indices that have been received from requesting ranks: pack values and gradients, then send */ 
    274         nbSendRequest = 0; 
    275         nbRecvRequest = 0; 
    276         for (int rank = 0; rank < mpiSize; rank++) 
    277         { 
    278                 if (nbRecvElement[rank] > 0) 
    279                 { 
    280                         int jj = 0; // jj == j if no weight writing 
    281                         for (int j = 0; j < nbRecvElement[rank]; j++) 
    282                         { 
    283                                 sendValue[rank][j] = sstree.localElements[recvElement[rank][j]].val; 
    284                                 sendArea[rank][j] = sstree.localElements[recvElement[rank][j]].area; 
    285                                 if (order == 2) 
    286                                 { 
    287                                         sendGrad[rank][jj] = sstree.localElements[recvElement[rank][j]].grad; 
    288 //          cout<<"grad  "<<jj<<"  "<<recvElement[rank][j]<<"  "<<sendGrad[rank][jj]<<" "<<sstree.localElements[recvElement[rank][j]].grad<<endl ; 
    289                                         sendNeighIds[rank][jj] = sstree.localElements[recvElement[rank][j]].src_id; 
    290                                         jj++; 
    291                                         for (int i = 0; i < NMAX; i++) 
    292                                         { 
    293                                                 sendGrad[rank][jj] = sstree.localElements[recvElement[rank][j]].gradNeigh[i]; 
    294 //            cout<<"grad  "<<jj<<"  "<<sendGrad[rank][jj]<<" "<<sstree.localElements[recvElement[rank][j]].grad<<endl ; 
    295             sendNeighIds[rank][jj] = sstree.localElements[recvElement[rank][j]].neighId[i]; 
    296                                                 jj++; 
    297                                         } 
    298                                 } 
    299                                 else 
    300                                         sendNeighIds[rank][j] = sstree.localElements[recvElement[rank][j]].src_id; 
    301                         } 
    302                         MPI_Issend(sendValue[rank],  nbRecvElement[rank], MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    303                         nbSendRequest++; 
    304                         MPI_Issend(sendArea[rank],  nbRecvElement[rank], MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    305                         nbSendRequest++; 
    306                         if (order == 2) 
    307                         { 
    308                                 MPI_Issend(sendGrad[rank], 3*nbRecvElement[rank]*(NMAX+1), 
    309                                                                 MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    310                                 nbSendRequest++; 
    311                                 MPI_Issend(sendNeighIds[rank], 4*nbRecvElement[rank]*(NMAX+1), MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    312 //ym  --> attention taille GloId 
    313                                 nbSendRequest++; 
    314                         } 
    315                         else 
    316                         { 
    317                                 MPI_Issend(sendNeighIds[rank], 4*nbRecvElement[rank], MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    318 //ym  --> attention taille GloId 
    319                                 nbSendRequest++; 
    320                         } 
    321                 } 
    322                 if (nbSendElement[rank] > 0) 
    323                 { 
    324                         MPI_Irecv(recvValue[rank],  nbSendElement[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    325                         nbRecvRequest++; 
    326                         MPI_Irecv(recvArea[rank],  nbSendElement[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    327                         nbRecvRequest++; 
    328                         if (order == 2) 
    329                         { 
    330                                 MPI_Irecv(recvGrad[rank], 3*nbSendElement[rank]*(NMAX+1), 
    331                                                 MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    332                                 nbRecvRequest++; 
    333                                 MPI_Irecv(recvNeighIds[rank], 4*nbSendElement[rank]*(NMAX+1), MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    334 //ym  --> attention taille GloId 
    335                                 nbRecvRequest++; 
    336                         } 
    337                         else 
    338                         { 
    339                                 MPI_Irecv(recvNeighIds[rank], 4*nbSendElement[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    340 //ym  --> attention taille GloId 
    341                                 nbRecvRequest++; 
    342                         } 
    343                 } 
    344         } 
    345         MPI_Waitall(nbRecvRequest, recvRequest, status); 
    346         MPI_Waitall(nbSendRequest, sendRequest, status); 
    347  
    348         /* now that all values and gradients are available use them to computed interpolated values on target 
    349            and also to compute weights */ 
    350         int i = 0; 
    351         for (int j = 0; j < nbElements; j++) 
    352         { 
    353                 Elt& e = elements[j]; 
    354  
    355                 /* since for the 2nd order case source grid elements can contribute to a destination grid element over several "paths" 
    356                    (step1: gradient is computed using neighbours on same grid, step2: intersection uses several elements on other grid) 
    357                    accumulate them so that there is only one final weight between two elements */ 
    358                 map<GloId,double> wgt_map; 
    359  
    360                 /* for destination element `e` loop over all intersetions/the corresponding source elements */ 
    361                 for (list<Polyg *>::iterator it = e.is.begin(); it != e.is.end(); it++) 
    362                 { 
    363                         /* it is the intersection element, so it->x and it->area are barycentre and area of intersection element (super mesh) 
    364                         but it->id is id of the source element that it intersects */ 
    365                         int n1 = (*it)->id.ind; 
    366                         int rank = (*it)->id.rank; 
    367                         double fk = recvValue[rank][n1]; 
    368                         double srcArea = recvArea[rank][n1]; 
    369                         double w = (*it)->area; 
    370                         if (quantity) w/=srcArea ; 
    371  
    372                         /* first order: src value times weight (weight = supermesh area), later divide by target area */ 
    373                         int kk = (order == 2) ? n1 * (NMAX + 1) : n1; 
    374                         GloId neighID = recvNeighIds[rank][kk]; 
    375                         wgt_map[neighID] += w; 
    376  
    377                         if (order == 2) 
    378                         { 
    379                                 for (int k = 0; k < NMAX+1; k++) 
    380                                 { 
    381                                         int kk = n1 * (NMAX + 1) + k; 
    382                                         GloId neighID = recvNeighIds[rank][kk]; 
    383                                         if (neighID.ind != -1)  wgt_map[neighID] += w * scalarprod(recvGrad[rank][kk], (*it)->x); 
    384                                 } 
    385  
    386                         } 
    387                 } 
    388  
    389     double renorm=0; 
    390     if (renormalize)  
    391       for (map<GloId,double>::iterator it = wgt_map.begin(); it != wgt_map.end(); it++) renorm+=it->second / e.area; 
    392     else renorm=1. ; 
    393  
    394     for (map<GloId,double>::iterator it = wgt_map.begin(); it != wgt_map.end(); it++) 
    395                 { 
    396       if (quantity)  this->remapMatrix[i] = (it->second ) / renorm; 
    397                         else this->remapMatrix[i] = (it->second / e.area) / renorm; 
    398                         this->srcAddress[i] = it->first.ind; 
    399                         this->srcRank[i] = it->first.rank; 
    400                         this->dstAddress[i] = j; 
    401       this->sourceWeightId[i]= it->first.globalId ; 
    402       this->targetWeightId[i]= targetGlobalId[j] ; 
    403                         i++; 
    404                 } 
    405         } 
    406  
    407         /* free all memory allocated in this function */ 
    408         for (int rank = 0; rank < mpiSize; rank++) 
    409         { 
    410                 if (nbSendElement[rank] > 0) 
    411                 { 
    412                         delete[] sendElement[rank]; 
    413                         delete[] recvValue[rank]; 
    414                         delete[] recvArea[rank]; 
    415                         if (order == 2) 
    416                         { 
    417                                 delete[] recvGrad[rank]; 
    418                         } 
    419                         delete[] recvNeighIds[rank]; 
    420                 } 
    421                 if (nbRecvElement[rank] > 0) 
    422                 { 
    423                         delete[] recvElement[rank]; 
    424                         delete[] sendValue[rank]; 
    425                         delete[] sendArea[rank]; 
    426                         if (order == 2) 
    427                                 delete[] sendGrad[rank]; 
    428                         delete[] sendNeighIds[rank]; 
    429                 } 
    430         } 
    431         delete[] status; 
    432         delete[] sendRequest; 
    433         delete[] recvRequest; 
    434         delete[] elementList; 
    435         delete[] nbSendElement; 
    436         delete[] nbRecvElement; 
    437         delete[] sendElement; 
    438         delete[] recvElement; 
    439         delete[] sendValue; 
    440         delete[] recvValue; 
    441         delete[] sendGrad; 
    442         delete[] recvGrad; 
    443         delete[] sendNeighIds; 
    444         delete[] recvNeighIds; 
    445         return i; 
     170    int mpiSize, mpiRank; 
     171    MPI_Comm_size(communicator, &mpiSize); 
     172    MPI_Comm_rank(communicator, &mpiRank); 
     173 
     174    /* create list of intersections (super mesh elements) for each rank */ 
     175    multimap<int, Polyg *> *elementList = new multimap<int, Polyg *>[mpiSize]; 
     176    for (int j = 0; j < nbElements; j++) 
     177    { 
     178        Elt& e = elements[j]; 
     179        for (list<Polyg *>::iterator it = e.is.begin(); it != e.is.end(); it++) 
     180            elementList[(*it)->id.rank].insert(pair<int, Polyg *>((*it)->id.ind, *it)); 
     181    } 
     182 
     183    int *nbSendElement = new int[mpiSize]; 
     184    int **sendElement = new int*[mpiSize]; /* indices of elements required from other rank */ 
     185    double **recvValue = new double*[mpiSize]; 
     186    double **recvArea = new double*[mpiSize]; 
     187    Coord **recvGrad = new Coord*[mpiSize]; 
     188    GloId **recvNeighIds = new GloId*[mpiSize]; /* ids of the of the source neighbours which also contribute through gradient */ 
     189    for (int rank = 0; rank < mpiSize; rank++) 
     190    { 
     191        /* get size for allocation */ 
     192        int last = -1; /* compares unequal to any index */ 
     193        int index = -1; /* increased to starting index 0 in first iteration */ 
     194        for (multimap<int, Polyg *>::iterator it = elementList[rank].begin(); it != elementList[rank].end(); ++it) 
     195        { 
     196            if (last != it->first) 
     197                index++; 
     198            (it->second)->id.ind = index; 
     199            last = it->first; 
     200        } 
     201        nbSendElement[rank] = index + 1; 
     202 
     203        /* if size is non-zero allocate and collect indices of elements on other ranks that we intersect */ 
     204        if (nbSendElement[rank] > 0) 
     205        { 
     206            sendElement[rank] = new int[nbSendElement[rank]]; 
     207            recvValue[rank]   = new double[nbSendElement[rank]]; 
     208            recvArea[rank]    = new double[nbSendElement[rank]]; 
     209            if (order == 2) 
     210            { 
     211                recvNeighIds[rank] = new GloId[nbSendElement[rank]*(NMAX+1)]; 
     212                recvGrad[rank]    = new Coord[nbSendElement[rank]*(NMAX+1)]; 
     213            } 
     214            else 
     215                recvNeighIds[rank] = new GloId[nbSendElement[rank]]; 
     216 
     217            last = -1; 
     218            index = -1; 
     219            for (multimap<int, Polyg *>::iterator it = elementList[rank].begin(); it != elementList[rank].end(); ++it) 
     220            { 
     221                if (last != it->first) 
     222                    index++; 
     223                sendElement[rank][index] = it->first; 
     224                last = it->first; 
     225            } 
     226        } 
     227    } 
     228 
     229    /* communicate sizes of source elements to be sent (index lists and later values and gradients) */ 
     230    int *nbRecvElement = new int[mpiSize]; 
     231    MPI_Alltoall(nbSendElement, 1, MPI_INT, nbRecvElement, 1, MPI_INT, communicator); 
     232 
     233    /* communicate indices of source elements on other ranks whoes value and gradient we need (since intersection) */ 
     234    int nbSendRequest = 0; 
     235    int nbRecvRequest = 0; 
     236    int **recvElement = new int*[mpiSize]; 
     237    double **sendValue = new double*[mpiSize]; 
     238    double **sendArea = new double*[mpiSize]; 
     239    Coord **sendGrad = new Coord*[mpiSize]; 
     240    GloId **sendNeighIds = new GloId*[mpiSize]; 
     241    MPI_Request *sendRequest = new MPI_Request[4*mpiSize]; 
     242    MPI_Request *recvRequest = new MPI_Request[4*mpiSize]; 
     243    for (int rank = 0; rank < mpiSize; rank++) 
     244    { 
     245        if (nbSendElement[rank] > 0) 
     246        { 
     247            MPI_Issend(sendElement[rank], nbSendElement[rank], MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     248            nbSendRequest++; 
     249        } 
     250 
     251        if (nbRecvElement[rank] > 0) 
     252        { 
     253            recvElement[rank] = new int[nbRecvElement[rank]]; 
     254            sendValue[rank]   = new double[nbRecvElement[rank]]; 
     255            sendArea[rank]   = new double[nbRecvElement[rank]]; 
     256            if (order == 2) 
     257            { 
     258                sendNeighIds[rank] = new GloId[nbRecvElement[rank]*(NMAX+1)]; 
     259                sendGrad[rank]    = new Coord[nbRecvElement[rank]*(NMAX+1)]; 
     260            } 
     261            else 
     262            { 
     263                sendNeighIds[rank] = new GloId[nbRecvElement[rank]]; 
     264            } 
     265            MPI_Irecv(recvElement[rank], nbRecvElement[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     266            nbRecvRequest++; 
     267        } 
     268    } 
     269 
     270    MPI_Status *status = new MPI_Status[4*mpiSize]; 
     271     
     272    MPI_Waitall(nbSendRequest, sendRequest, status); 
     273    MPI_Waitall(nbRecvRequest, recvRequest, status); 
     274 
     275    /* for all indices that have been received from requesting ranks: pack values and gradients, then send */ 
     276    nbSendRequest = 0; 
     277    nbRecvRequest = 0; 
     278    for (int rank = 0; rank < mpiSize; rank++) 
     279    { 
     280        if (nbRecvElement[rank] > 0) 
     281        { 
     282            int jj = 0; // jj == j if no weight writing 
     283            for (int j = 0; j < nbRecvElement[rank]; j++) 
     284            { 
     285                sendValue[rank][j] = sstree.localElements[recvElement[rank][j]].val; 
     286                sendArea[rank][j] = sstree.localElements[recvElement[rank][j]].area; 
     287                if (order == 2) 
     288                { 
     289                    sendGrad[rank][jj] = sstree.localElements[recvElement[rank][j]].grad; 
     290                    sendNeighIds[rank][jj] = sstree.localElements[recvElement[rank][j]].src_id; 
     291                    jj++; 
     292                    for (int i = 0; i < NMAX; i++) 
     293                    { 
     294                        sendGrad[rank][jj] = sstree.localElements[recvElement[rank][j]].gradNeigh[i]; 
     295                        sendNeighIds[rank][jj] = sstree.localElements[recvElement[rank][j]].neighId[i]; 
     296                        jj++; 
     297                    } 
     298                } 
     299                else 
     300                    sendNeighIds[rank][j] = sstree.localElements[recvElement[rank][j]].src_id; 
     301            } 
     302            MPI_Issend(sendValue[rank],  nbRecvElement[rank], MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     303            nbSendRequest++; 
     304            MPI_Issend(sendArea[rank],  nbRecvElement[rank], MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     305            nbSendRequest++; 
     306            if (order == 2) 
     307            { 
     308                MPI_Issend(sendGrad[rank], 3*nbRecvElement[rank]*(NMAX+1), 
     309                        MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     310                nbSendRequest++; 
     311                MPI_Issend(sendNeighIds[rank], 4*nbRecvElement[rank]*(NMAX+1), MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     312                //ym  --> attention taille GloId 
     313                nbSendRequest++; 
     314            } 
     315            else 
     316            { 
     317                MPI_Issend(sendNeighIds[rank], 4*nbRecvElement[rank], MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     318                //ym  --> attention taille GloId 
     319                nbSendRequest++; 
     320                 
     321            } 
     322        } 
     323        if (nbSendElement[rank] > 0) 
     324        { 
     325            MPI_Irecv(recvValue[rank],  nbSendElement[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     326            nbRecvRequest++; 
     327            MPI_Irecv(recvArea[rank],  nbSendElement[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     328            nbRecvRequest++; 
     329            if (order == 2) 
     330            { 
     331                MPI_Irecv(recvGrad[rank], 3*nbSendElement[rank]*(NMAX+1), 
     332                        MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     333                nbRecvRequest++; 
     334                MPI_Irecv(recvNeighIds[rank], 4*nbSendElement[rank]*(NMAX+1), MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     335                //ym  --> attention taille GloId 
     336                nbRecvRequest++; 
     337            } 
     338            else 
     339            { 
     340                MPI_Irecv(recvNeighIds[rank], 4*nbSendElement[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     341                //ym  --> attention taille GloId 
     342                nbRecvRequest++; 
     343            } 
     344        } 
     345    } 
     346     
     347    MPI_Waitall(nbSendRequest, sendRequest, status); 
     348    MPI_Waitall(nbRecvRequest, recvRequest, status); 
     349 
     350    /* now that all values and gradients are available use them to computed interpolated values on target 
     351       and also to compute weights */ 
     352    int i = 0; 
     353    for (int j = 0; j < nbElements; j++) 
     354    { 
     355        Elt& e = elements[j]; 
     356 
     357        /* since for the 2nd order case source grid elements can contribute to a destination grid element over several "paths" 
     358           (step1: gradient is computed using neighbours on same grid, step2: intersection uses several elements on other grid) 
     359           accumulate them so that there is only one final weight between two elements */ 
     360        map<GloId,double> wgt_map; 
     361 
     362        /* for destination element `e` loop over all intersetions/the corresponding source elements */ 
     363        for (list<Polyg *>::iterator it = e.is.begin(); it != e.is.end(); it++) 
     364        { 
     365            /* it is the intersection element, so it->x and it->area are barycentre and area of intersection element (super mesh) 
     366               but it->id is id of the source element that it intersects */ 
     367            int n1 = (*it)->id.ind; 
     368            int rank = (*it)->id.rank; 
     369            double fk = recvValue[rank][n1]; 
     370            double srcArea = recvArea[rank][n1]; 
     371            double w = (*it)->area; 
     372            if (quantity) w/=srcArea ; 
     373 
     374            /* first order: src value times weight (weight = supermesh area), later divide by target area */ 
     375            int kk = (order == 2) ? n1 * (NMAX + 1) : n1; 
     376            GloId neighID = recvNeighIds[rank][kk]; 
     377            wgt_map[neighID] += w; 
     378 
     379            if (order == 2) 
     380            { 
     381                for (int k = 0; k < NMAX+1; k++) 
     382                { 
     383                    int kk = n1 * (NMAX + 1) + k; 
     384                    GloId neighID = recvNeighIds[rank][kk]; 
     385                    if (neighID.ind != -1)  wgt_map[neighID] += w * scalarprod(recvGrad[rank][kk], (*it)->x); 
     386                } 
     387 
     388            } 
     389        } 
     390 
     391        double renorm=0; 
     392        if (renormalize)  
     393            for (map<GloId,double>::iterator it = wgt_map.begin(); it != wgt_map.end(); it++) renorm+=it->second / e.area; 
     394        else renorm=1. ; 
     395 
     396        for (map<GloId,double>::iterator it = wgt_map.begin(); it != wgt_map.end(); it++) 
     397        { 
     398            if (quantity)  this->remapMatrix[i] = (it->second ) / renorm; 
     399            else this->remapMatrix[i] = (it->second / e.area) / renorm; 
     400            this->srcAddress[i] = it->first.ind; 
     401            this->srcRank[i] = it->first.rank; 
     402            this->dstAddress[i] = j; 
     403            this->sourceWeightId[i]= it->first.globalId ; 
     404            this->targetWeightId[i]= targetGlobalId[j] ; 
     405            i++; 
     406        } 
     407    } 
     408 
     409    /* free all memory allocated in this function */ 
     410    for (int rank = 0; rank < mpiSize; rank++) 
     411    { 
     412        if (nbSendElement[rank] > 0) 
     413        { 
     414            delete[] sendElement[rank]; 
     415            delete[] recvValue[rank]; 
     416            delete[] recvArea[rank]; 
     417            if (order == 2) 
     418            { 
     419                delete[] recvGrad[rank]; 
     420            } 
     421            delete[] recvNeighIds[rank]; 
     422        } 
     423        if (nbRecvElement[rank] > 0) 
     424        { 
     425            delete[] recvElement[rank]; 
     426            delete[] sendValue[rank]; 
     427            delete[] sendArea[rank]; 
     428            if (order == 2) 
     429                delete[] sendGrad[rank]; 
     430            delete[] sendNeighIds[rank]; 
     431        } 
     432    } 
     433    delete[] status; 
     434    delete[] sendRequest; 
     435    delete[] recvRequest; 
     436    delete[] elementList; 
     437    delete[] nbSendElement; 
     438    delete[] nbRecvElement; 
     439    delete[] sendElement; 
     440    delete[] recvElement; 
     441    delete[] sendValue; 
     442    delete[] recvValue; 
     443    delete[] sendGrad; 
     444    delete[] recvGrad; 
     445    delete[] sendNeighIds; 
     446    delete[] recvNeighIds; 
     447    return i; 
    446448} 
    447449 
    448450void Mapper::computeGrads() 
    449451{ 
    450         /* array of pointers to collect local elements and elements received from other cpu */ 
    451         vector<Elt*> globalElements(sstree.nbLocalElements + nbNeighbourElements); 
    452         int index = 0; 
    453         for (int i = 0; i < sstree.nbLocalElements; i++, index++) 
    454                 globalElements[index] = &(sstree.localElements[i]); 
    455         for (int i = 0; i < nbNeighbourElements; i++, index++) 
    456                 globalElements[index] = &neighbourElements[i]; 
    457  
    458         update_baryc(sstree.localElements, sstree.nbLocalElements); 
    459         computeGradients(&globalElements[0], sstree.nbLocalElements); 
     452    /* array of pointers to collect local elements and elements received from other cpu */ 
     453    vector<Elt*> globalElements(sstree.nbLocalElements + nbNeighbourElements); 
     454    int index = 0; 
     455    for (int i = 0; i < sstree.nbLocalElements; i++, index++) 
     456        globalElements[index] = &(sstree.localElements[i]); 
     457    for (int i = 0; i < nbNeighbourElements; i++, index++) 
     458        globalElements[index] = &neighbourElements[i]; 
     459 
     460    update_baryc(sstree.localElements, sstree.nbLocalElements); 
     461    computeGradients(&globalElements[0], sstree.nbLocalElements); 
    460462} 
    461463 
    462464/** for each element of the source grid, finds all the neighbouring elements that share an edge 
    463     (filling array neighbourElements). This is used later to compute gradients */ 
     465  (filling array neighbourElements). This is used later to compute gradients */ 
    464466void Mapper::buildMeshTopology() 
    465467{ 
    466         int mpiSize, mpiRank; 
    467         MPI_Comm_size(communicator, &mpiSize); 
    468         MPI_Comm_rank(communicator, &mpiRank); 
    469  
    470         vector<Node> *routingList = new vector<Node>[mpiSize]; 
    471         vector<vector<int> > routes(sstree.localTree.leafs.size()); 
    472  
    473         sstree.routeIntersections(routes, sstree.localTree.leafs); 
    474  
    475         for (int i = 0; i < routes.size(); ++i) 
    476                 for (int k = 0; k < routes[i].size(); ++k) 
    477                         routingList[routes[i][k]].push_back(sstree.localTree.leafs[i]); 
    478         routingList[mpiRank].clear(); 
    479  
    480  
    481         CMPIRouting mpiRoute(communicator); 
    482         mpiRoute.init(routes); 
    483         int nRecv = mpiRoute.getTotalSourceElement(); 
    484 // cout << mpiRank << " NRECV " << nRecv << "(" << routes.size() << ")"<< endl; 
    485  
    486         int *nbSendNode = new int[mpiSize]; 
    487         int *nbRecvNode = new int[mpiSize]; 
    488         int *sendMessageSize = new int[mpiSize]; 
    489         int *recvMessageSize = new int[mpiSize]; 
    490  
    491         for (int rank = 0; rank < mpiSize; rank++) 
    492         { 
    493                 nbSendNode[rank] = routingList[rank].size(); 
    494                 sendMessageSize[rank] = 0; 
    495                 for (size_t j = 0; j < routingList[rank].size(); j++) 
    496                 { 
    497                         Elt *elt = (Elt *) (routingList[rank][j].data); 
    498                         sendMessageSize[rank] += packedPolygonSize(*elt); 
    499                 } 
    500         } 
    501  
    502         MPI_Alltoall(nbSendNode, 1, MPI_INT, nbRecvNode, 1, MPI_INT, communicator); 
    503         MPI_Alltoall(sendMessageSize, 1, MPI_INT, recvMessageSize, 1, MPI_INT, communicator); 
    504  
    505         char **sendBuffer = new char*[mpiSize]; 
    506         char **recvBuffer = new char*[mpiSize]; 
    507         int *pos = new int[mpiSize]; 
    508  
    509         for (int rank = 0; rank < mpiSize; rank++) 
    510         { 
    511                 if (nbSendNode[rank] > 0) sendBuffer[rank] = new char[sendMessageSize[rank]]; 
    512                 if (nbRecvNode[rank] > 0) recvBuffer[rank] = new char[recvMessageSize[rank]]; 
    513         } 
    514  
    515         for (int rank = 0; rank < mpiSize; rank++) 
    516         { 
    517                 pos[rank] = 0; 
    518                 for (size_t j = 0; j < routingList[rank].size(); j++) 
    519                 { 
    520                         Elt *elt = (Elt *) (routingList[rank][j].data); 
    521                         packPolygon(*elt, sendBuffer[rank], pos[rank]); 
    522                 } 
    523         } 
    524         delete [] routingList; 
    525  
    526  
    527         int nbSendRequest = 0; 
    528         int nbRecvRequest = 0; 
    529         MPI_Request *sendRequest = new MPI_Request[mpiSize]; 
    530         MPI_Request *recvRequest = new MPI_Request[mpiSize]; 
    531         MPI_Status  *status      = new MPI_Status[mpiSize]; 
    532  
    533         for (int rank = 0; rank < mpiSize; rank++) 
    534         { 
    535                 if (nbSendNode[rank] > 0) 
    536                 { 
    537                         MPI_Issend(sendBuffer[rank], sendMessageSize[rank], MPI_CHAR, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    538                         nbSendRequest++; 
    539                 } 
    540                 if (nbRecvNode[rank] > 0) 
    541                 { 
    542                         MPI_Irecv(recvBuffer[rank], recvMessageSize[rank], MPI_CHAR, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    543                         nbRecvRequest++; 
    544                 } 
    545         } 
    546  
    547         MPI_Waitall(nbRecvRequest, recvRequest, status); 
    548         MPI_Waitall(nbSendRequest, sendRequest, status); 
    549  
    550         for (int rank = 0; rank < mpiSize; rank++) 
    551                 if (nbSendNode[rank] > 0) delete [] sendBuffer[rank]; 
    552         delete [] sendBuffer; 
    553  
    554         char **sendBuffer2 = new char*[mpiSize]; 
    555         char **recvBuffer2 = new char*[mpiSize]; 
    556  
    557         for (int rank = 0; rank < mpiSize; rank++) 
    558         { 
    559                 nbSendNode[rank] = 0; 
    560                 sendMessageSize[rank] = 0; 
    561  
    562                 if (nbRecvNode[rank] > 0) 
    563                 { 
    564                         set<NodePtr> neighbourList; 
    565                         pos[rank] = 0; 
    566                         for (int j = 0; j < nbRecvNode[rank]; j++) 
    567                         { 
    568                                 Elt elt; 
    569                                 unpackPolygon(elt, recvBuffer[rank], pos[rank]); 
    570                                 Node node(elt.x, cptRadius(elt), &elt); 
    571                                 findNeighbour(sstree.localTree.root, &node, neighbourList); 
    572                         } 
    573                         nbSendNode[rank] = neighbourList.size(); 
    574                         for (set<NodePtr>::iterator it = neighbourList.begin(); it != neighbourList.end(); it++) 
    575                         { 
    576                                 Elt *elt = (Elt *) ((*it)->data); 
    577                                 sendMessageSize[rank] += packedPolygonSize(*elt); 
    578                         } 
    579  
    580                         sendBuffer2[rank] = new char[sendMessageSize[rank]]; 
    581                         pos[rank] = 0; 
    582  
    583                         for (set<NodePtr>::iterator it = neighbourList.begin(); it != neighbourList.end(); it++) 
    584                         { 
    585                                 Elt *elt = (Elt *) ((*it)->data); 
    586                                 packPolygon(*elt, sendBuffer2[rank], pos[rank]); 
    587                         } 
    588                 } 
    589         } 
    590         for (int rank = 0; rank < mpiSize; rank++) 
    591                 if (nbRecvNode[rank] > 0) delete [] recvBuffer[rank]; 
    592         delete [] recvBuffer; 
    593  
    594  
    595         MPI_Barrier(communicator); 
    596         MPI_Alltoall(nbSendNode, 1, MPI_INT, nbRecvNode, 1, MPI_INT, communicator); 
    597         MPI_Alltoall(sendMessageSize, 1, MPI_INT, recvMessageSize, 1, MPI_INT, communicator); 
    598  
    599         for (int rank = 0; rank < mpiSize; rank++) 
    600                 if (nbRecvNode[rank] > 0) recvBuffer2[rank] = new char[recvMessageSize[rank]]; 
    601  
    602         nbSendRequest = 0; 
    603         nbRecvRequest = 0; 
    604  
    605         for (int rank = 0; rank < mpiSize; rank++) 
    606         { 
    607                 if (nbSendNode[rank] > 0) 
    608                 { 
    609                         MPI_Issend(sendBuffer2[rank], sendMessageSize[rank], MPI_CHAR, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    610                         nbSendRequest++; 
    611                 } 
    612                 if (nbRecvNode[rank] > 0) 
    613                 { 
    614                         MPI_Irecv(recvBuffer2[rank], recvMessageSize[rank], MPI_CHAR, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    615                         nbRecvRequest++; 
    616                 } 
    617         } 
    618  
    619         MPI_Waitall(nbRecvRequest, recvRequest, status); 
    620         MPI_Waitall(nbSendRequest, sendRequest, status); 
    621  
    622         int nbNeighbourNodes = 0; 
    623         for (int rank = 0; rank < mpiSize; rank++) 
    624                 nbNeighbourNodes += nbRecvNode[rank]; 
    625  
    626         neighbourElements = new Elt[nbNeighbourNodes]; 
    627         nbNeighbourElements = nbNeighbourNodes; 
    628  
    629         int index = 0; 
    630         for (int rank = 0; rank < mpiSize; rank++) 
    631         { 
    632                 pos[rank] = 0; 
    633                 for (int j = 0; j < nbRecvNode[rank]; j++) 
    634                 { 
    635                         unpackPolygon(neighbourElements[index], recvBuffer2[rank], pos[rank]); 
    636                         neighbourElements[index].id.ind = sstree.localTree.leafs.size() + index; 
    637                         index++; 
    638                 } 
    639         } 
    640         for (int rank = 0; rank < mpiSize; rank++) 
    641         { 
    642                 if (nbRecvNode[rank] > 0) delete [] recvBuffer2[rank]; 
    643                 if (nbSendNode[rank] > 0) delete [] sendBuffer2[rank]; 
    644         } 
    645         delete [] recvBuffer2; 
    646         delete [] sendBuffer2; 
    647         delete [] sendMessageSize; 
    648         delete [] recvMessageSize; 
    649         delete [] nbSendNode; 
    650         delete [] nbRecvNode; 
    651         delete [] sendRequest; 
    652         delete [] recvRequest; 
    653         delete [] status; 
    654         delete [] pos; 
    655  
    656         /* re-compute on received elements to avoid having to send this information */ 
    657         neighbourNodes.resize(nbNeighbourNodes); 
    658         setCirclesAndLinks(neighbourElements, neighbourNodes); 
    659         cptAllEltsGeom(neighbourElements, nbNeighbourNodes, srcGrid.pole); 
    660  
    661         /* the local SS tree must include nodes from other cpus if they are potential 
    662            intersector of a local node */ 
    663         sstree.localTree.insertNodes(neighbourNodes); 
    664  
    665         /* for every local element, 
    666            use the SS-tree to find all elements (including neighbourElements) 
    667            who are potential neighbours because their circles intersect, 
    668            then check all canditates for common edges to build up connectivity information 
    669         */ 
    670         for (int j = 0; j < sstree.localTree.leafs.size(); j++) 
    671         { 
    672                 Node& node = sstree.localTree.leafs[j]; 
    673  
    674                 /* find all leafs whoes circles that intersect node's circle and save into node->intersectors */ 
    675                 node.search(sstree.localTree.root); 
    676  
    677                 Elt *elt = (Elt *)(node.data); 
    678  
    679                 for (int i = 0; i < elt->n; i++) elt->neighbour[i] = NOT_FOUND; 
    680  
    681                 /* for element `elt` loop through all nodes in the SS-tree 
    682                    whoes circles intersect with the circle around `elt` (the SS intersectors) 
    683                    and check if they are neighbours in the sense that the two elements share an edge. 
    684                    If they do, save this information for elt */ 
    685                 for (list<NodePtr>::iterator it = (node.intersectors).begin(); it != (node.intersectors).end(); ++it) 
    686                 { 
    687                         Elt *elt2 = (Elt *)((*it)->data); 
    688                         set_neighbour(*elt, *elt2); 
    689                 } 
    690  
    691 /* 
    692                 for (int i = 0; i < elt->n; i++) 
    693                 { 
    694                         if (elt->neighbour[i] == NOT_FOUND) 
    695                                 error_exit("neighbour not found"); 
    696                 } 
    697 */ 
    698         } 
     468    int mpiSize, mpiRank; 
     469    MPI_Comm_size(communicator, &mpiSize); 
     470    MPI_Comm_rank(communicator, &mpiRank); 
     471 
     472    vector<Node> *routingList = new vector<Node>[mpiSize]; 
     473    vector<vector<int> > routes(sstree.localTree.leafs.size()); 
     474 
     475    sstree.routeIntersections(routes, sstree.localTree.leafs); 
     476 
     477    for (int i = 0; i < routes.size(); ++i) 
     478        for (int k = 0; k < routes[i].size(); ++k) 
     479            routingList[routes[i][k]].push_back(sstree.localTree.leafs[i]); 
     480    routingList[mpiRank].clear(); 
     481 
     482 
     483    CMPIRouting mpiRoute(communicator); 
     484    mpiRoute.init(routes); 
     485    int nRecv = mpiRoute.getTotalSourceElement(); 
     486    // cout << mpiRank << " NRECV " << nRecv << "(" << routes.size() << ")"<< endl; 
     487 
     488    int *nbSendNode = new int[mpiSize]; 
     489    int *nbRecvNode = new int[mpiSize]; 
     490    int *sendMessageSize = new int[mpiSize]; 
     491    int *recvMessageSize = new int[mpiSize]; 
     492 
     493    for (int rank = 0; rank < mpiSize; rank++) 
     494    { 
     495        nbSendNode[rank] = routingList[rank].size(); 
     496        sendMessageSize[rank] = 0; 
     497        for (size_t j = 0; j < routingList[rank].size(); j++) 
     498        { 
     499            Elt *elt = (Elt *) (routingList[rank][j].data); 
     500            sendMessageSize[rank] += packedPolygonSize(*elt); 
     501        } 
     502    } 
     503 
     504    MPI_Alltoall(nbSendNode, 1, MPI_INT, nbRecvNode, 1, MPI_INT, communicator); 
     505    MPI_Alltoall(sendMessageSize, 1, MPI_INT, recvMessageSize, 1, MPI_INT, communicator); 
     506 
     507    char **sendBuffer = new char*[mpiSize]; 
     508    char **recvBuffer = new char*[mpiSize]; 
     509    int *pos = new int[mpiSize]; 
     510 
     511    for (int rank = 0; rank < mpiSize; rank++) 
     512    { 
     513        if (nbSendNode[rank] > 0) sendBuffer[rank] = new char[sendMessageSize[rank]]; 
     514        if (nbRecvNode[rank] > 0) recvBuffer[rank] = new char[recvMessageSize[rank]]; 
     515    } 
     516 
     517    for (int rank = 0; rank < mpiSize; rank++) 
     518    { 
     519        pos[rank] = 0; 
     520        for (size_t j = 0; j < routingList[rank].size(); j++) 
     521        { 
     522            Elt *elt = (Elt *) (routingList[rank][j].data); 
     523            packPolygon(*elt, sendBuffer[rank], pos[rank]); 
     524        } 
     525    } 
     526    delete [] routingList; 
     527 
     528 
     529    int nbSendRequest = 0; 
     530    int nbRecvRequest = 0; 
     531    MPI_Request *sendRequest = new MPI_Request[mpiSize]; 
     532    MPI_Request *recvRequest = new MPI_Request[mpiSize]; 
     533    MPI_Status  *status      = new MPI_Status[mpiSize]; 
     534 
     535    for (int rank = 0; rank < mpiSize; rank++) 
     536    { 
     537        if (nbSendNode[rank] > 0) 
     538        { 
     539            MPI_Issend(sendBuffer[rank], sendMessageSize[rank], MPI_CHAR, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     540            nbSendRequest++; 
     541        } 
     542        if (nbRecvNode[rank] > 0) 
     543        { 
     544            MPI_Irecv(recvBuffer[rank], recvMessageSize[rank], MPI_CHAR, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     545            nbRecvRequest++; 
     546        } 
     547    } 
     548 
     549    MPI_Waitall(nbRecvRequest, recvRequest, status); 
     550    MPI_Waitall(nbSendRequest, sendRequest, status); 
     551 
     552    for (int rank = 0; rank < mpiSize; rank++) 
     553        if (nbSendNode[rank] > 0) delete [] sendBuffer[rank]; 
     554    delete [] sendBuffer; 
     555 
     556    char **sendBuffer2 = new char*[mpiSize]; 
     557    char **recvBuffer2 = new char*[mpiSize]; 
     558 
     559    for (int rank = 0; rank < mpiSize; rank++) 
     560    { 
     561        nbSendNode[rank] = 0; 
     562        sendMessageSize[rank] = 0; 
     563 
     564        if (nbRecvNode[rank] > 0) 
     565        { 
     566            set<NodePtr> neighbourList; 
     567            pos[rank] = 0; 
     568            for (int j = 0; j < nbRecvNode[rank]; j++) 
     569            { 
     570                Elt elt; 
     571                unpackPolygon(elt, recvBuffer[rank], pos[rank]); 
     572                Node node(elt.x, cptRadius(elt), &elt); 
     573                findNeighbour(sstree.localTree.root, &node, neighbourList); 
     574            } 
     575            nbSendNode[rank] = neighbourList.size(); 
     576            for (set<NodePtr>::iterator it = neighbourList.begin(); it != neighbourList.end(); it++) 
     577            { 
     578                Elt *elt = (Elt *) ((*it)->data); 
     579                sendMessageSize[rank] += packedPolygonSize(*elt); 
     580            } 
     581 
     582            sendBuffer2[rank] = new char[sendMessageSize[rank]]; 
     583            pos[rank] = 0; 
     584 
     585            for (set<NodePtr>::iterator it = neighbourList.begin(); it != neighbourList.end(); it++) 
     586            { 
     587                Elt *elt = (Elt *) ((*it)->data); 
     588                packPolygon(*elt, sendBuffer2[rank], pos[rank]); 
     589            } 
     590        } 
     591    } 
     592    for (int rank = 0; rank < mpiSize; rank++) 
     593        if (nbRecvNode[rank] > 0) delete [] recvBuffer[rank]; 
     594    delete [] recvBuffer; 
     595 
     596 
     597    MPI_Barrier(communicator); 
     598    MPI_Alltoall(nbSendNode, 1, MPI_INT, nbRecvNode, 1, MPI_INT, communicator); 
     599    MPI_Alltoall(sendMessageSize, 1, MPI_INT, recvMessageSize, 1, MPI_INT, communicator); 
     600 
     601    for (int rank = 0; rank < mpiSize; rank++) 
     602        if (nbRecvNode[rank] > 0) recvBuffer2[rank] = new char[recvMessageSize[rank]]; 
     603 
     604    nbSendRequest = 0; 
     605    nbRecvRequest = 0; 
     606 
     607    for (int rank = 0; rank < mpiSize; rank++) 
     608    { 
     609        if (nbSendNode[rank] > 0) 
     610        { 
     611            MPI_Issend(sendBuffer2[rank], sendMessageSize[rank], MPI_CHAR, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     612            nbSendRequest++; 
     613        } 
     614        if (nbRecvNode[rank] > 0) 
     615        { 
     616            MPI_Irecv(recvBuffer2[rank], recvMessageSize[rank], MPI_CHAR, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     617            nbRecvRequest++; 
     618        } 
     619    } 
     620 
     621    MPI_Waitall(nbRecvRequest, recvRequest, status); 
     622    MPI_Waitall(nbSendRequest, sendRequest, status); 
     623 
     624    int nbNeighbourNodes = 0; 
     625    for (int rank = 0; rank < mpiSize; rank++) 
     626        nbNeighbourNodes += nbRecvNode[rank]; 
     627 
     628    neighbourElements = new Elt[nbNeighbourNodes]; 
     629    nbNeighbourElements = nbNeighbourNodes; 
     630 
     631    int index = 0; 
     632    for (int rank = 0; rank < mpiSize; rank++) 
     633    { 
     634        pos[rank] = 0; 
     635        for (int j = 0; j < nbRecvNode[rank]; j++) 
     636        { 
     637            unpackPolygon(neighbourElements[index], recvBuffer2[rank], pos[rank]); 
     638            neighbourElements[index].id.ind = sstree.localTree.leafs.size() + index; 
     639            index++; 
     640        } 
     641    } 
     642    for (int rank = 0; rank < mpiSize; rank++) 
     643    { 
     644        if (nbRecvNode[rank] > 0) delete [] recvBuffer2[rank]; 
     645        if (nbSendNode[rank] > 0) delete [] sendBuffer2[rank]; 
     646    } 
     647    delete [] recvBuffer2; 
     648    delete [] sendBuffer2; 
     649    delete [] sendMessageSize; 
     650    delete [] recvMessageSize; 
     651    delete [] nbSendNode; 
     652    delete [] nbRecvNode; 
     653    delete [] sendRequest; 
     654    delete [] recvRequest; 
     655    delete [] status; 
     656    delete [] pos; 
     657 
     658    /* re-compute on received elements to avoid having to send this information */ 
     659    neighbourNodes.resize(nbNeighbourNodes); 
     660    setCirclesAndLinks(neighbourElements, neighbourNodes); 
     661    cptAllEltsGeom(neighbourElements, nbNeighbourNodes, srcGrid.pole); 
     662 
     663    /* the local SS tree must include nodes from other cpus if they are potential 
     664       intersector of a local node */ 
     665    sstree.localTree.insertNodes(neighbourNodes); 
     666 
     667    /* for every local element, 
     668       use the SS-tree to find all elements (including neighbourElements) 
     669       who are potential neighbours because their circles intersect, 
     670       then check all canditates for common edges to build up connectivity information 
     671       */ 
     672    for (int j = 0; j < sstree.localTree.leafs.size(); j++) 
     673    { 
     674        Node& node = sstree.localTree.leafs[j]; 
     675 
     676        /* find all leafs whoes circles that intersect node's circle and save into node->intersectors */ 
     677        node.search(sstree.localTree.root); 
     678 
     679        Elt *elt = (Elt *)(node.data); 
     680 
     681        for (int i = 0; i < elt->n; i++) elt->neighbour[i] = NOT_FOUND; 
     682 
     683        /* for element `elt` loop through all nodes in the SS-tree 
     684           whoes circles intersect with the circle around `elt` (the SS intersectors) 
     685           and check if they are neighbours in the sense that the two elements share an edge. 
     686           If they do, save this information for elt */ 
     687        for (list<NodePtr>::iterator it = (node.intersectors).begin(); it != (node.intersectors).end(); ++it) 
     688        { 
     689            Elt *elt2 = (Elt *)((*it)->data); 
     690            set_neighbour(*elt, *elt2); 
     691        } 
     692 
     693        /* 
     694           for (int i = 0; i < elt->n; i++) 
     695           { 
     696           if (elt->neighbour[i] == NOT_FOUND) 
     697           error_exit("neighbour not found"); 
     698           } 
     699           */ 
     700    } 
    699701} 
    700702 
     
    702704void Mapper::computeIntersection(Elt *elements, int nbElements) 
    703705{ 
    704         int mpiSize, mpiRank; 
    705         MPI_Comm_size(communicator, &mpiSize); 
    706         MPI_Comm_rank(communicator, &mpiRank); 
    707  
    708         MPI_Barrier(communicator); 
    709  
    710         vector<Node> *routingList = new vector<Node>[mpiSize]; 
    711  
    712         vector<Node> routeNodes;  routeNodes.reserve(nbElements); 
    713         for (int j = 0; j < nbElements; j++) 
    714         { 
    715                 elements[j].id.ind = j; 
    716                 elements[j].id.rank = mpiRank; 
    717                 routeNodes.push_back(Node(elements[j].x, cptRadius(elements[j]), &elements[j])); 
    718         } 
    719  
    720         vector<vector<int> > routes(routeNodes.size()); 
    721         sstree.routeIntersections(routes, routeNodes); 
    722         for (int i = 0; i < routes.size(); ++i) 
    723                 for (int k = 0; k < routes[i].size(); ++k) 
    724                         routingList[routes[i][k]].push_back(routeNodes[i]); 
    725  
    726         if (verbose >= 2) 
    727         { 
    728                 cout << " --> rank  " << mpiRank << " nbElements " << nbElements << " : "; 
    729                 for (int rank = 0; rank < mpiSize; rank++) 
    730                         cout << routingList[rank].size() << "   "; 
    731                 cout << endl; 
    732         } 
    733         MPI_Barrier(communicator); 
    734  
    735         int *nbSendNode = new int[mpiSize]; 
    736         int *nbRecvNode = new int[mpiSize]; 
    737         int *sentMessageSize = new int[mpiSize]; 
    738         int *recvMessageSize = new int[mpiSize]; 
    739  
    740         for (int rank = 0; rank < mpiSize; rank++) 
    741         { 
    742                 nbSendNode[rank] = routingList[rank].size(); 
    743                 sentMessageSize[rank] = 0; 
    744                 for (size_t j = 0; j < routingList[rank].size(); j++) 
    745                 { 
    746                         Elt *elt = (Elt *) (routingList[rank][j].data); 
    747                         sentMessageSize[rank] += packedPolygonSize(*elt); 
    748                 } 
    749         } 
    750  
    751         MPI_Alltoall(nbSendNode, 1, MPI_INT, nbRecvNode, 1, MPI_INT, communicator); 
    752         MPI_Alltoall(sentMessageSize, 1, MPI_INT, recvMessageSize, 1, MPI_INT, communicator); 
    753  
    754         int total = 0; 
    755  
    756         for (int rank = 0; rank < mpiSize; rank++) 
    757         { 
    758                 total = total + nbRecvNode[rank]; 
    759         } 
    760  
    761         if (verbose >= 2) cout << "---> rank " << mpiRank << " : compute intersection : total received nodes  " << total << endl; 
    762         char **sendBuffer = new char*[mpiSize]; 
    763         char **recvBuffer = new char*[mpiSize]; 
    764         int *pos = new int[mpiSize]; 
    765  
    766         for (int rank = 0; rank < mpiSize; rank++) 
    767         { 
    768                 if (nbSendNode[rank] > 0) sendBuffer[rank] = new char[sentMessageSize[rank]]; 
    769                 if (nbRecvNode[rank] > 0) recvBuffer[rank] = new char[recvMessageSize[rank]]; 
    770         } 
    771  
    772         for (int rank = 0; rank < mpiSize; rank++) 
    773         { 
    774                 pos[rank] = 0; 
    775                 for (size_t j = 0; j < routingList[rank].size(); j++) 
    776                 { 
    777                         Elt* elt = (Elt *) (routingList[rank][j].data); 
    778                         packPolygon(*elt, sendBuffer[rank], pos[rank]); 
    779                 } 
    780         } 
    781         delete [] routingList; 
    782  
    783         int nbSendRequest = 0; 
    784         int nbRecvRequest = 0; 
    785         MPI_Request *sendRequest = new MPI_Request[mpiSize]; 
    786         MPI_Request *recvRequest = new MPI_Request[mpiSize]; 
    787         MPI_Status   *status = new MPI_Status[mpiSize]; 
    788  
    789         for (int rank = 0; rank < mpiSize; rank++) 
    790         { 
    791                 if (nbSendNode[rank] > 0) 
    792                 { 
    793                         MPI_Issend(sendBuffer[rank], sentMessageSize[rank], MPI_CHAR, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    794                         nbSendRequest++; 
    795                 } 
    796                 if (nbRecvNode[rank] > 0) 
    797                 { 
    798                         MPI_Irecv(recvBuffer[rank], recvMessageSize[rank], MPI_CHAR, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    799                         nbRecvRequest++; 
    800                 } 
    801         } 
    802  
    803         MPI_Waitall(nbRecvRequest, recvRequest, status); 
    804         MPI_Waitall(nbSendRequest, sendRequest, status); 
    805         char **sendBuffer2 = new char*[mpiSize]; 
    806         char **recvBuffer2 = new char*[mpiSize]; 
    807  
    808         double tic = cputime(); 
    809         for (int rank = 0; rank < mpiSize; rank++) 
    810         { 
    811                 sentMessageSize[rank] = 0; 
    812  
    813                 if (nbRecvNode[rank] > 0) 
    814                 { 
    815                         Elt *recvElt = new Elt[nbRecvNode[rank]]; 
    816                         pos[rank] = 0; 
    817                         for (int j = 0; j < nbRecvNode[rank]; j++) 
    818                         { 
    819                                 unpackPolygon(recvElt[j], recvBuffer[rank], pos[rank]); 
    820                                 cptEltGeom(recvElt[j], tgtGrid.pole); 
    821                                 Node recvNode(recvElt[j].x, cptRadius(recvElt[j]), &recvElt[j]); 
    822                                 recvNode.search(sstree.localTree.root); 
    823                                 /* for a node holding an element of the target, loop throught candidates for intersecting source */ 
    824                                 for (list<NodePtr>::iterator it = (recvNode.intersectors).begin(); it != (recvNode.intersectors).end(); ++it) 
    825                                 { 
    826                                         Elt *elt2 = (Elt *) ((*it)->data); 
    827                                         /* recvElt is target, elt2 is source */ 
    828 //                                      intersect(&recvElt[j], elt2); 
    829                                         intersect_ym(&recvElt[j], elt2); 
    830                                 } 
    831  
    832                                 if (recvElt[j].is.size() > 0) sentMessageSize[rank] += packIntersectionSize(recvElt[j]); 
    833  
    834                                 // here recvNode goes out of scope 
    835                         } 
    836  
    837                         if (sentMessageSize[rank] > 0) 
    838                         { 
    839                                 sentMessageSize[rank] += sizeof(int); 
    840                                 sendBuffer2[rank] = new char[sentMessageSize[rank]]; 
    841                                 *((int *) sendBuffer2[rank]) = 0; 
    842                                 pos[rank] = sizeof(int); 
    843                                 for (int j = 0; j < nbRecvNode[rank]; j++) 
    844                                 { 
    845                                         packIntersection(recvElt[j], sendBuffer2[rank], pos[rank]); 
    846                                         //FIXME should be deleted: recvElt[j].delete_intersections(); // intersection areas have been packed to buffer and won't be used any more 
    847                                 } 
    848                         } 
    849                         delete [] recvElt; 
    850  
    851                 } 
    852         } 
    853         delete [] pos; 
    854  
    855         for (int rank = 0; rank < mpiSize; rank++) 
    856         { 
    857                 if (nbSendNode[rank] > 0) delete [] sendBuffer[rank]; 
    858                 if (nbRecvNode[rank] > 0) delete [] recvBuffer[rank]; 
    859                 nbSendNode[rank] = 0; 
    860         } 
    861  
    862         if (verbose >= 2) cout << "Rank " << mpiRank << "  Compute (internal) intersection " << cputime() - tic << " s" << endl; 
    863         MPI_Alltoall(sentMessageSize, 1, MPI_INT, recvMessageSize, 1, MPI_INT, communicator); 
    864  
    865         for (int rank = 0; rank < mpiSize; rank++) 
    866                 if (recvMessageSize[rank] > 0) 
    867                         recvBuffer2[rank] = new char[recvMessageSize[rank]]; 
    868  
    869         nbSendRequest = 0; 
    870         nbRecvRequest = 0; 
    871  
    872         for (int rank = 0; rank < mpiSize; rank++) 
    873         { 
    874                 if (sentMessageSize[rank] > 0) 
    875                 { 
    876                         MPI_Issend(sendBuffer2[rank], sentMessageSize[rank], MPI_CHAR, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    877                         nbSendRequest++; 
    878                 } 
    879                 if (recvMessageSize[rank] > 0) 
    880                 { 
    881                         MPI_Irecv(recvBuffer2[rank], recvMessageSize[rank], MPI_CHAR, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    882                         nbRecvRequest++; 
    883                 } 
    884         } 
    885  
    886         MPI_Waitall(nbRecvRequest, recvRequest, status); 
    887         MPI_Waitall(nbSendRequest, sendRequest, status); 
    888  
    889         delete [] sendRequest; 
    890         delete [] recvRequest; 
    891         delete [] status; 
    892         for (int rank = 0; rank < mpiSize; rank++) 
    893         { 
    894                 if (nbRecvNode[rank] > 0) 
    895                 { 
    896                         if (sentMessageSize[rank] > 0) 
    897                                 delete [] sendBuffer2[rank]; 
    898                 } 
    899  
    900                 if (recvMessageSize[rank] > 0) 
    901                 { 
    902                         unpackIntersection(elements, recvBuffer2[rank]); 
    903                         delete [] recvBuffer2[rank]; 
    904                 } 
    905         } 
    906         delete [] sendBuffer2; 
    907         delete [] recvBuffer2; 
    908         delete [] sendBuffer; 
    909         delete [] recvBuffer; 
    910  
    911         delete [] nbSendNode; 
    912         delete [] nbRecvNode; 
    913         delete [] sentMessageSize; 
    914         delete [] recvMessageSize; 
     706    int mpiSize, mpiRank; 
     707    MPI_Comm_size(communicator, &mpiSize); 
     708    MPI_Comm_rank(communicator, &mpiRank); 
     709 
     710    MPI_Barrier(communicator); 
     711 
     712    vector<Node> *routingList = new vector<Node>[mpiSize]; 
     713 
     714    vector<Node> routeNodes;  routeNodes.reserve(nbElements); 
     715    for (int j = 0; j < nbElements; j++) 
     716    { 
     717        elements[j].id.ind = j; 
     718        elements[j].id.rank = mpiRank; 
     719        routeNodes.push_back(Node(elements[j].x, cptRadius(elements[j]), &elements[j])); 
     720    } 
     721 
     722    vector<vector<int> > routes(routeNodes.size()); 
     723    sstree.routeIntersections(routes, routeNodes); 
     724    for (int i = 0; i < routes.size(); ++i) 
     725        for (int k = 0; k < routes[i].size(); ++k) 
     726            routingList[routes[i][k]].push_back(routeNodes[i]); 
     727 
     728    if (verbose >= 2) 
     729    { 
     730        cout << " --> rank  " << mpiRank << " nbElements " << nbElements << " : "; 
     731        for (int rank = 0; rank < mpiSize; rank++) 
     732            cout << routingList[rank].size() << "   "; 
     733        cout << endl; 
     734    } 
     735    MPI_Barrier(communicator); 
     736 
     737    int *nbSendNode = new int[mpiSize]; 
     738    int *nbRecvNode = new int[mpiSize]; 
     739    int *sentMessageSize = new int[mpiSize]; 
     740    int *recvMessageSize = new int[mpiSize]; 
     741 
     742    for (int rank = 0; rank < mpiSize; rank++) 
     743    { 
     744        nbSendNode[rank] = routingList[rank].size(); 
     745        sentMessageSize[rank] = 0; 
     746        for (size_t j = 0; j < routingList[rank].size(); j++) 
     747        { 
     748            Elt *elt = (Elt *) (routingList[rank][j].data); 
     749            sentMessageSize[rank] += packedPolygonSize(*elt); 
     750        } 
     751    } 
     752 
     753    MPI_Alltoall(nbSendNode, 1, MPI_INT, nbRecvNode, 1, MPI_INT, communicator); 
     754    MPI_Alltoall(sentMessageSize, 1, MPI_INT, recvMessageSize, 1, MPI_INT, communicator); 
     755 
     756    int total = 0; 
     757 
     758    for (int rank = 0; rank < mpiSize; rank++) 
     759    { 
     760        total = total + nbRecvNode[rank]; 
     761    } 
     762 
     763    if (verbose >= 2) cout << "---> rank " << mpiRank << " : compute intersection : total received nodes  " << total << endl; 
     764    char **sendBuffer = new char*[mpiSize]; 
     765    char **recvBuffer = new char*[mpiSize]; 
     766    int *pos = new int[mpiSize]; 
     767 
     768    for (int rank = 0; rank < mpiSize; rank++) 
     769    { 
     770        if (nbSendNode[rank] > 0) sendBuffer[rank] = new char[sentMessageSize[rank]]; 
     771        if (nbRecvNode[rank] > 0) recvBuffer[rank] = new char[recvMessageSize[rank]]; 
     772    } 
     773 
     774    for (int rank = 0; rank < mpiSize; rank++) 
     775    { 
     776        pos[rank] = 0; 
     777        for (size_t j = 0; j < routingList[rank].size(); j++) 
     778        { 
     779            Elt* elt = (Elt *) (routingList[rank][j].data); 
     780            packPolygon(*elt, sendBuffer[rank], pos[rank]); 
     781        } 
     782    } 
     783    delete [] routingList; 
     784 
     785    int nbSendRequest = 0; 
     786    int nbRecvRequest = 0; 
     787    MPI_Request *sendRequest = new MPI_Request[mpiSize]; 
     788    MPI_Request *recvRequest = new MPI_Request[mpiSize]; 
     789    MPI_Status   *status = new MPI_Status[mpiSize]; 
     790 
     791    for (int rank = 0; rank < mpiSize; rank++) 
     792    { 
     793        if (nbSendNode[rank] > 0) 
     794        { 
     795            MPI_Issend(sendBuffer[rank], sentMessageSize[rank], MPI_CHAR, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     796            nbSendRequest++; 
     797        } 
     798        if (nbRecvNode[rank] > 0) 
     799        { 
     800            MPI_Irecv(recvBuffer[rank], recvMessageSize[rank], MPI_CHAR, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     801            nbRecvRequest++; 
     802        } 
     803    } 
     804 
     805    MPI_Waitall(nbRecvRequest, recvRequest, status); 
     806    MPI_Waitall(nbSendRequest, sendRequest, status); 
     807    char **sendBuffer2 = new char*[mpiSize]; 
     808    char **recvBuffer2 = new char*[mpiSize]; 
     809 
     810    double tic = cputime(); 
     811    for (int rank = 0; rank < mpiSize; rank++) 
     812    { 
     813        sentMessageSize[rank] = 0; 
     814 
     815        if (nbRecvNode[rank] > 0) 
     816        { 
     817            Elt *recvElt = new Elt[nbRecvNode[rank]]; 
     818            pos[rank] = 0; 
     819            for (int j = 0; j < nbRecvNode[rank]; j++) 
     820            { 
     821                unpackPolygon(recvElt[j], recvBuffer[rank], pos[rank]); 
     822                cptEltGeom(recvElt[j], tgtGrid.pole); 
     823                Node recvNode(recvElt[j].x, cptRadius(recvElt[j]), &recvElt[j]); 
     824                recvNode.search(sstree.localTree.root); 
     825                /* for a node holding an element of the target, loop throught candidates for intersecting source */ 
     826                for (list<NodePtr>::iterator it = (recvNode.intersectors).begin(); it != (recvNode.intersectors).end(); ++it) 
     827                { 
     828                    Elt *elt2 = (Elt *) ((*it)->data); 
     829                    /* recvElt is target, elt2 is source */ 
     830                    //                                  intersect(&recvElt[j], elt2); 
     831                    intersect_ym(&recvElt[j], elt2); 
     832                } 
     833 
     834                if (recvElt[j].is.size() > 0) sentMessageSize[rank] += packIntersectionSize(recvElt[j]); 
     835 
     836                // here recvNode goes out of scope 
     837            } 
     838 
     839            if (sentMessageSize[rank] > 0) 
     840            { 
     841                sentMessageSize[rank] += sizeof(int); 
     842                sendBuffer2[rank] = new char[sentMessageSize[rank]]; 
     843                *((int *) sendBuffer2[rank]) = 0; 
     844                pos[rank] = sizeof(int); 
     845                for (int j = 0; j < nbRecvNode[rank]; j++) 
     846                { 
     847                    packIntersection(recvElt[j], sendBuffer2[rank], pos[rank]); 
     848                    //FIXME should be deleted: recvElt[j].delete_intersections(); // intersection areas have been packed to buffer and won't be used any more 
     849                } 
     850            } 
     851            delete [] recvElt; 
     852 
     853        } 
     854    } 
     855    delete [] pos; 
     856 
     857    for (int rank = 0; rank < mpiSize; rank++) 
     858    { 
     859        if (nbSendNode[rank] > 0) delete [] sendBuffer[rank]; 
     860        if (nbRecvNode[rank] > 0) delete [] recvBuffer[rank]; 
     861        nbSendNode[rank] = 0; 
     862    } 
     863 
     864    if (verbose >= 2) cout << "Rank " << mpiRank << "  Compute (internal) intersection " << cputime() - tic << " s" << endl; 
     865    MPI_Alltoall(sentMessageSize, 1, MPI_INT, recvMessageSize, 1, MPI_INT, communicator); 
     866 
     867    for (int rank = 0; rank < mpiSize; rank++) 
     868        if (recvMessageSize[rank] > 0) 
     869            recvBuffer2[rank] = new char[recvMessageSize[rank]]; 
     870 
     871    nbSendRequest = 0; 
     872    nbRecvRequest = 0; 
     873 
     874    for (int rank = 0; rank < mpiSize; rank++) 
     875    { 
     876        if (sentMessageSize[rank] > 0) 
     877        { 
     878            MPI_Issend(sendBuffer2[rank], sentMessageSize[rank], MPI_CHAR, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     879            nbSendRequest++; 
     880        } 
     881        if (recvMessageSize[rank] > 0) 
     882        { 
     883            MPI_Irecv(recvBuffer2[rank], recvMessageSize[rank], MPI_CHAR, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     884            nbRecvRequest++; 
     885        } 
     886    } 
     887 
     888    MPI_Waitall(nbRecvRequest, recvRequest, status); 
     889    MPI_Waitall(nbSendRequest, sendRequest, status); 
     890 
     891    delete [] sendRequest; 
     892    delete [] recvRequest; 
     893    delete [] status; 
     894    for (int rank = 0; rank < mpiSize; rank++) 
     895    { 
     896        if (nbRecvNode[rank] > 0) 
     897        { 
     898            if (sentMessageSize[rank] > 0) 
     899                delete [] sendBuffer2[rank]; 
     900        } 
     901 
     902        if (recvMessageSize[rank] > 0) 
     903        { 
     904            unpackIntersection(elements, recvBuffer2[rank]); 
     905            delete [] recvBuffer2[rank]; 
     906        } 
     907    } 
     908    delete [] sendBuffer2; 
     909    delete [] recvBuffer2; 
     910    delete [] sendBuffer; 
     911    delete [] recvBuffer; 
     912 
     913    delete [] nbSendNode; 
     914    delete [] nbRecvNode; 
     915    delete [] sentMessageSize; 
     916    delete [] recvMessageSize; 
    915917} 
    916918 
    917919Mapper::~Mapper() 
    918920{ 
    919         delete [] remapMatrix; 
    920         delete [] srcAddress; 
    921         delete [] srcRank; 
    922         delete [] dstAddress; 
    923         if (neighbourElements) delete [] neighbourElements; 
    924 } 
    925  
    926 } 
     921    delete [] remapMatrix; 
     922    delete [] srcAddress; 
     923    delete [] srcRank; 
     924    delete [] dstAddress; 
     925    if (neighbourElements) delete [] neighbourElements; 
     926} 
     927 
     928} 
  • XIOS/dev/branch_yushan_merged/extern/src_ep_dev/ep_gatherv.cpp

    r1134 r1138  
    484484    mpi_size = comm.ep_comm_ptr->size_rank_info[2].second; 
    485485     
    486  
    487     assert(accumulate(recvcounts, recvcounts+ep_size-1, 0) == displs[ep_size-1]); // Only for continuous gather. 
     486    if(ep_size == mpi_size)  
     487      return ::MPI_Allgatherv(sendbuf, sendcount, static_cast< ::MPI_Datatype>(datatype), recvbuf, recvcounts, displs, 
     488                              static_cast< ::MPI_Datatype>(datatype), static_cast< ::MPI_Comm>(comm.mpi_comm)); 
     489     
     490 
     491    assert(accumulate(recvcounts, recvcounts+ep_size-1, 0) >= displs[ep_size-1]); // Only for continuous gather. 
    488492 
    489493 
  • XIOS/dev/branch_yushan_merged/extern/src_ep_dev/ep_memory.cpp

    r1134 r1138  
    1010  int MPI_Alloc_mem(MPI_Aint size, MPI_Info info, void *baseptr) 
    1111  { 
    12     ::MPI_Alloc_mem(size.mpi_aint, static_cast< ::MPI_Info>(info.mpi_info), baseptr); 
     12    //::MPI_Alloc_mem(size.mpi_aint, static_cast< ::MPI_Info>(info.mpi_info), baseptr); 
     13    ::MPI_Alloc_mem(size.mpi_aint, MPI_INFO_NULL_STD, baseptr); 
    1314    return 0; 
    1415   } 
     
    1617  int MPI_Alloc_mem(unsigned long size, MPI_Info info, void *baseptr) 
    1718  { 
    18     ::MPI_Alloc_mem(size, static_cast< ::MPI_Info>(info.mpi_info), baseptr); 
     19    //::MPI_Alloc_mem(size, static_cast< ::MPI_Info>(info.mpi_info), baseptr); 
     20    ::MPI_Alloc_mem(size, MPI_INFO_NULL_STD, baseptr); 
    1921    return 0; 
    2022  } 
  • XIOS/dev/branch_yushan_merged/extern/src_ep_dev/ep_wait.cpp

    r1134 r1138  
    11/*! 
    2    \file ep_wait.cpp 
    3    \since 2 may 2016 
     2  \file ep_wait.cpp 
     3  \since 2 may 2016 
    44 
    5    \brief Definitions of MPI wait function: MPI_Wait, MPI_Waitall, MPI_Waitsome, MPI_Waitany 
    6  */ 
     5  \brief Definitions of MPI wait function: MPI_Wait, MPI_Waitall, MPI_Waitsome, MPI_Waitany 
     6  */ 
    77 
    88#include "ep_lib.hpp" 
     
    1616namespace ep_lib {       
    1717 
    18         int MPI_Wait(MPI_Request *request, MPI_Status *status) 
    19         { 
     18    int MPI_Wait(MPI_Request *request, MPI_Status *status) 
     19    { 
    2020 
    21     if(request->type == 1) 
    22     { 
    23       ::MPI_Request mpi_request = static_cast< ::MPI_Request >(request->mpi_request); 
    24       ::MPI_Status mpi_status; 
    25       ::MPI_Wait(&mpi_request, &mpi_status); 
    26  
    27  
    28        
    29       status->mpi_status = &mpi_status; 
    30       status->ep_src = request->ep_src; 
    31       status->ep_tag = request->ep_tag; 
    32       status->ep_datatype = request->ep_datatype; 
    33  
    34       return 0; 
    35     } 
    36  
    37     if(request->type == 2) 
    38     { 
    39       int flag = false; 
    40       MPI_Message message; 
    41  
    42       while(!flag) 
    43       { 
    44         Message_Check(request->comm); 
    45         #pragma omp flush 
    46         MPI_Improbe(request->ep_src, request->ep_tag, request->comm, &flag, &message, status); 
    47       } 
    48  
    49       int count; 
    50       MPI_Get_count(status, request->ep_datatype, &count); 
    51       MPI_Mrecv(request->buf, count, request->ep_datatype, &message, status); 
    52       status->ep_datatype = request->ep_datatype; 
    53  
    54       //check_sum_recv(request->buf, count, request->ep_datatype, request->ep_src, request->ep_tag, request->comm, 2); 
    55  
    56       return 0; 
    57     } 
    58  
    59     if(request->type == 3) 
    60     { 
    61       ::MPI_Request mpi_request = static_cast< ::MPI_Request >(request->mpi_request); 
    62       ::MPI_Status mpi_status; 
    63       ::MPI_Wait(&mpi_request, &mpi_status); 
    64        
    65       status->mpi_status = new ::MPI_Status(mpi_status); 
    66       status->ep_src = request->ep_src; 
    67       status->ep_tag = request->ep_tag; 
    68       status->ep_datatype = request->ep_datatype; 
    69  
    70       //int count; 
    71       //MPI_Get_count(status, request->ep_datatype, &count); 
    72       //check_sum_recv(request->buf, count, request->ep_datatype, request->ep_src, request->ep_tag, request->comm, 2); 
    73     } 
    74           return MPI_SUCCESS; 
    75         } 
     21        if(request->type == 1) 
     22        { 
     23            ::MPI_Request mpi_request = static_cast< ::MPI_Request >(request->mpi_request); 
     24            ::MPI_Status mpi_status; 
     25            ::MPI_Wait(&mpi_request, &mpi_status); 
    7626 
    7727 
    7828 
    79          
     29            status->mpi_status = &mpi_status; 
     30            status->ep_src = request->ep_src; 
     31            status->ep_tag = request->ep_tag; 
     32            status->ep_datatype = request->ep_datatype; 
     33 
     34            return 0; 
     35        } 
     36 
     37        if(request->type == 2) 
     38        { 
     39            int flag = false; 
     40            MPI_Message message; 
     41 
     42            while(!flag) 
     43            { 
     44                Message_Check(request->comm); 
     45#pragma omp flush 
     46                MPI_Improbe(request->ep_src, request->ep_tag, request->comm, &flag, &message, status); 
     47            } 
     48 
     49            int count; 
     50            MPI_Get_count(status, request->ep_datatype, &count); 
     51            MPI_Mrecv(request->buf, count, request->ep_datatype, &message, status); 
     52            status->ep_datatype = request->ep_datatype; 
     53 
     54            //check_sum_recv(request->buf, count, request->ep_datatype, request->ep_src, request->ep_tag, request->comm, 2); 
     55 
     56            return 0; 
     57        } 
     58 
     59        if(request->type == 3) 
     60        { 
     61            ::MPI_Request mpi_request = static_cast< ::MPI_Request >(request->mpi_request); 
     62            ::MPI_Status mpi_status; 
     63            ::MPI_Wait(&mpi_request, &mpi_status); 
     64 
     65            status->mpi_status = new ::MPI_Status(mpi_status); 
     66            status->ep_src = request->ep_src; 
     67            status->ep_tag = request->ep_tag; 
     68            status->ep_datatype = request->ep_datatype; 
     69 
     70            //int count; 
     71            //MPI_Get_count(status, request->ep_datatype, &count); 
     72            //check_sum_recv(request->buf, count, request->ep_datatype, request->ep_src, request->ep_tag, request->comm, 2); 
     73        } 
     74        return MPI_SUCCESS; 
     75    } 
    8076 
    8177 
    82         int MPI_Waitall(int count, MPI_Request *array_of_requests, MPI_Status *array_of_statuses) 
    83         { 
    84     int dest_rank; 
    85     MPI_Comm_rank(MPI_COMM_WORLD, &dest_rank); 
    86      
    87     int finished = 0; 
    88     bool finished_index[count]; 
    8978 
    90           for(int i=0; i<count; i++) 
     79 
     80 
     81 
     82    int MPI_Waitall(int count, MPI_Request *array_of_requests, MPI_Status *array_of_statuses) 
    9183    { 
    92       finished_index[i] = false; 
     84        int dest_rank; 
     85        MPI_Comm_rank(MPI_COMM_WORLD, &dest_rank); 
     86 
     87        int finished = 0; 
     88        bool finished_index[count]; 
     89 
     90        for(int i=0; i<count; i++) 
     91        { 
     92            finished_index[i] = false; 
     93        } 
     94 
     95        while(finished < count) 
     96        { 
     97            for(int i=0; i<count; i++) 
     98            { 
     99                if(finished_index[i] == false) // this request has not been tested. 
     100                { 
     101                    if(array_of_requests[i].type != 2) // isend or imrecv 
     102                    {       
     103                        MPI_Wait(&array_of_requests[i], &array_of_statuses[i]); 
     104                        if(array_of_requests[i].type == 3) 
     105                        { 
     106                            //int check_count; 
     107                            //MPI_Get_count(&array_of_statuses[i], array_of_requests[i].ep_datatype, &check_count); 
     108                            //check_sum_recv(array_of_requests[i].buf, count, array_of_requests[i].ep_datatype, array_of_requests[i].ep_src, array_of_requests[i].ep_tag, array_of_requests[i].comm, 2); 
     109                        } 
     110                        finished++; 
     111                        finished_index[i] = true; 
     112                    } 
     113                    else // irecv 
     114                    { 
     115                        int flag = false; 
     116                        MPI_Message message; 
     117 
     118                        MPI_Improbe(array_of_requests[i].ep_src, array_of_requests[i].ep_tag, array_of_requests[i].comm, &flag, &message, &array_of_statuses[i]); 
     119 
     120                        if(flag) 
     121                        { 
     122                            //printf("dest_rank = %d, Waiting one message with src = %d, tag = %d, buf = %p\n", dest_rank, array_of_requests[i].ep_src, array_of_requests[i].ep_tag, array_of_requests[i].buf); 
     123                            int recv_count; 
     124                            MPI_Get_count(&array_of_statuses[i], array_of_requests[i].ep_datatype, &recv_count); 
     125                            MPI_Mrecv(array_of_requests[i].buf, recv_count, array_of_requests[i].ep_datatype, &message, &array_of_statuses[i]); 
     126                            //check_sum_recv(array_of_requests[i].buf, recv_count, array_of_requests[i].ep_datatype, array_of_requests[i].ep_src, array_of_requests[i].ep_tag, array_of_requests[i].comm, 2); 
     127 
     128                            finished++; 
     129                            finished_index[i] = true; 
     130                        } 
     131                    } 
     132                } 
     133            }     
     134        } 
     135        return MPI_SUCCESS; 
    93136    } 
    94  
    95     while(finished < count) 
    96     { 
    97       for(int i=0; i<count; i++) 
    98       { 
    99         if(finished_index[i] == false) // this request has not been tested. 
    100         { 
    101           if(array_of_requests[i].type != 2) // isend or imrecv 
    102           {       
    103             MPI_Wait(&array_of_requests[i], &array_of_statuses[i]); 
    104             if(array_of_requests[i].type == 3) 
    105             { 
    106               //int check_count; 
    107               //MPI_Get_count(&array_of_statuses[i], array_of_requests[i].ep_datatype, &check_count); 
    108               //check_sum_recv(array_of_requests[i].buf, count, array_of_requests[i].ep_datatype, array_of_requests[i].ep_src, array_of_requests[i].ep_tag, array_of_requests[i].comm, 2); 
    109             } 
    110             finished++; 
    111             finished_index[i] = true; 
    112           } 
    113           else // irecv 
    114           { 
    115             int flag = false; 
    116             MPI_Message message; 
    117              
    118             MPI_Improbe(array_of_requests[i].ep_src, array_of_requests[i].ep_tag, array_of_requests[i].comm, &flag, &message, &array_of_statuses[i]); 
    119              
    120             if(flag) 
    121             { 
    122               //printf("dest_rank = %d, Waiting one message with src = %d, tag = %d, buf = %p\n", dest_rank, array_of_requests[i].ep_src, array_of_requests[i].ep_tag, array_of_requests[i].buf); 
    123               int recv_count; 
    124               MPI_Get_count(&array_of_statuses[i], array_of_requests[i].ep_datatype, &recv_count); 
    125               MPI_Mrecv(array_of_requests[i].buf, recv_count, array_of_requests[i].ep_datatype, &message, &array_of_statuses[i]); 
    126               //check_sum_recv(array_of_requests[i].buf, recv_count, array_of_requests[i].ep_datatype, array_of_requests[i].ep_src, array_of_requests[i].ep_tag, array_of_requests[i].comm, 2); 
    127  
    128               finished++; 
    129               finished_index[i] = true; 
    130             } 
    131           } 
    132         } 
    133       }     
    134     } 
    135           return MPI_SUCCESS; 
    136         } 
    137137 
    138138 
  • XIOS/dev/branch_yushan_merged/src/io/inetcdf4.cpp

    r1134 r1138  
    44 
    55#include <boost/algorithm/string.hpp> 
     6// mpi_std.hpp 
     7#ifdef _usingEP 
     8#include "ep_declaration.hpp" 
     9#endif 
    610 
    711namespace xios 
     
    1822    } 
    1923    mpi = comm && !multifile; 
    20     MPI_Info m_info; 
     24    MPI_Info m_info = MPI_INFO_NULL_STD; 
    2125 
    2226    // The file format will be detected automatically by NetCDF, it is safe to always set NC_MPIIO 
  • XIOS/dev/branch_yushan_merged/src/io/inetcdf4.hpp

    r1134 r1138  
    1313#define UNLIMITED_DIM (size_t)(-1) 
    1414#endif  // UNLIMITED_DIM 
     15 
    1516 
    1617namespace xios 
  • XIOS/dev/branch_yushan_merged/src/io/inetcdf4_decl.cpp

    r782 r1138  
    11#include "inetcdf4_impl.hpp" 
     2// mpi_std.hpp 
    23 
    34namespace xios 
  • XIOS/dev/branch_yushan_merged/src/io/inetcdf4_impl.hpp

    r782 r1138  
    44#include "inetcdf4.hpp" 
    55#include "netCdfInterface.hpp" 
     6// mpi_std.hpp 
    67 
    78namespace xios 
  • XIOS/dev/branch_yushan_merged/src/io/nc4_data_input.cpp

    r1064 r1138  
    88#include "scalar.hpp" 
    99 
     10// mpi.hpp 
     11 
    1012namespace xios 
    1113{ 
    12   CNc4DataInput::CNc4DataInput(const StdString& filename, MPI_Comm comm_file, bool multifile, bool isCollective /*= true*/, const StdString& timeCounterName /*= "time_counter"*/) 
     14  CNc4DataInput::CNc4DataInput(const StdString& filename, ::MPI_Comm comm_file, bool multifile, bool isCollective /*= true*/, const StdString& timeCounterName /*= "time_counter"*/) 
    1315    : SuperClass() 
    1416    , SuperClassWriter(filename, &comm_file, multifile, timeCounterName) 
  • XIOS/dev/branch_yushan_merged/src/io/nc4_data_input.hpp

    r967 r1138  
    66#include "data_input.hpp" 
    77#include "inetcdf4.hpp" 
     8// mpi_std.hpp 
    89 
    910namespace xios 
  • XIOS/dev/branch_yushan_merged/src/io/nc4_data_output.cpp

    r1134 r1138  
    1212#include "exception.hpp" 
    1313#include "uuid.hpp" 
     14// mpi.hpp 
    1415 
    1516namespace xios 
     
    2829      CNc4DataOutput::CNc4DataOutput 
    2930         (CFile* file, const StdString & filename, bool exist, bool useClassicFormat, bool useCFConvention, 
    30           ep_lib::MPI_Comm comm_file, bool multifile, bool isCollective, const StdString& timeCounterName) 
     31          ::MPI_Comm comm_file, bool multifile, bool isCollective, const StdString& timeCounterName) 
    3132            : SuperClass() 
    3233            , SuperClassWriter(filename, exist, useClassicFormat, useCFConvention, &comm_file, multifile, timeCounterName) 
     
    463464      StdString domainName = domain->name; 
    464465      domain->assignMesh(domainName, domain->nvertex); 
    465       domain->mesh->createMeshEpsilon(static_cast<MPI_Comm>(server->intraComm.mpi_comm), domain->lonvalue_srv, domain->latvalue_srv, domain->bounds_lon_srv, domain->bounds_lat_srv); 
     466      domain->mesh->createMeshEpsilon(static_cast< ::MPI_Comm >(server->intraComm.mpi_comm), domain->lonvalue_srv, domain->latvalue_srv, domain->bounds_lon_srv, domain->bounds_lat_srv); 
    466467 
    467468      StdString node_x = domainName + "_node_x"; 
  • XIOS/dev/branch_yushan_merged/src/io/nc4_data_output.hpp

    r1134 r1138  
    66#include "onetcdf4.hpp" 
    77#include "data_output.hpp" 
     8// mpi_std.hpp 
    89 
    910namespace xios 
     
    2627            CNc4DataOutput 
    2728               (CFile* file, const StdString & filename, bool exist, bool useClassicFormat, 
    28                 bool useCFConvention, 
    29                 ep_lib::MPI_Comm comm_file, bool multifile, bool isCollective = true, 
    30                 const StdString& timeCounterName = "time_counter"); 
     29                bool useCFConvention, MPI_Comm comm_file, bool multifile,  
     30                bool isCollective = true, const StdString& timeCounterName = "time_counter"); 
    3131 
    3232            CNc4DataOutput(const CNc4DataOutput & dataoutput);       // Not implemented. 
     
    116116 
    117117            /// Propriétés privées /// 
    118             ep_lib::MPI_Comm comm_file; 
     118            MPI_Comm comm_file; 
    119119            const StdString filename; 
    120120            std::map<Time, StdSize> timeToRecordCache; 
  • XIOS/dev/branch_yushan_merged/src/io/netCdfInterface.cpp

    r1050 r1138  
    1010#include "netCdfInterface.hpp" 
    1111#include "netCdfException.hpp" 
     12// mpi_std.hpp 
    1213 
    1314namespace xios 
  • XIOS/dev/branch_yushan_merged/src/io/netCdfInterface_decl.cpp

    r1050 r1138  
    99 
    1010#include "netCdfInterface_impl.hpp" 
     11// mpi_std.hpp 
    1112 
    1213namespace xios 
  • XIOS/dev/branch_yushan_merged/src/io/netCdfInterface_impl.hpp