Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
log category declaration cleanup; add a pointer from the log category description...
[simgrid.git] / src / modules.doc
index c85f3dc..30ad7c5 100644 (file)
-/** \defgroup SimGrid_API  API of SimGrid */
+/** 
+  \defgroup SimGrid_API  API of SimGrid */
 
 /** \defgroup XBT_API      XBT (eXtended Bundle of tools)
-    \ingroup SimGrid_API
-    \brief
-    The core toolbox of SimGrid, containing usefull datatypes, portability
-    support and so on.
-*/
-/** \defgroup XBT_ground   Grounding features of the XBT (logging and error reporting)
-    \ingroup XBT_API
+       \ingroup SimGrid_API
+       \brief The core toolbox of SimGrid, containing usefull datatypes,
+       portability support and so on.
 */
-    /** \defgroup XBT_log Logging support.
-     *  \ingroup XBT_ground
-     *  \brief A generic logging facility in the spirit of log4j
-     *
-     *  This section describes the API to the log functions used 
-     *  everywhere in this project.
-     
-<h3>Overview</h3>
+/**    \defgroup XBT_ground Grounding features of the XBT (logging and error reporting)
+       \ingroup XBT_API        */
+/**       \addtogroup  XBT_log
+          \ingroup XBT_ground  */
+/**       \addtogroup  XBT_error
+          \ingroup XBT_ground  */
+
+/**    \defgroup XBT_structs  Datatypes defined in the XBT
+       \ingroup XBT_API        */
+/**       \addtogroup XBT_dict
+          \ingroup XBT_structs */
+/**       \addtogroup XBT_dynar
+          \ingroup XBT_structs */
+/**       \addtogroup XBT_fifo
+          \ingroup XBT_structs */
+/**       \addtogroup XBT_set
+          \ingroup XBT_structs */
+/**        \addtogroup XBT_swag
+          \ingroup XBT_structs */
+/**       \addtogroup XBT_heap
+          \ingroup XBT_structs */
      
-This is an adaptation of the log4c project, which is dead upstream, and
-which I was given the permission to fork under the LGPL licence by the
-authors. log4c itself was loosely based on the Apache project's Log4J,
-Log4CC, etc. project. Because C is not object oriented, a lot had to change.
-    
-There is 3 main concepts: category, priority and appender. These three
-concepts work together to enable developers to log messages according to
-message type and priority, and to control at runtime how these messages are
-formatted and where they are reported.
-
-<h3>Category hierarchy</h3>
-
-The first and foremost advantage of any logging API over plain printf()
-resides in its ability to disable certain log statements while allowing
-others to print unhindered. This capability assumes that the logging space,
-that is, the space of all possible logging statements, is categorized
-according to some developer-chosen criteria. 
-         
-This observation led to choosing category as the central concept of the
-system. Every category is declared by providing a name and an optional
-parent. If no parent is explicitly named, the root category, LOG_ROOT_CAT is
-the category's parent. 
-      
-A category is created by a macro call at the top level of a file.  A
-category can be created with any one of the following macros:
-
- - \ref XBT_LOG_NEW_CATEGORY(MyCat); Create a new root
- - \ref XBT_LOG_NEW_SUBCATEGORY(MyCat, ParentCat);
-    Create a new category being child of the category ParentCat
- - \ref XBT_LOG_NEW_DEFAULT_CATEGORY(MyCat);
-    Like XBT_LOG_NEW_CATEGORY, but the new category is the default one
-      in this file
- -  \ref XBT_LOG_NEW_DEFAULT_SUBCATEGORY(MyCat, ParentCat);
-    Like XBT_LOG_NEW_SUBCATEGORY, but the new category is the default one
-      in this file
-           
-The parent cat can be defined in the same file or in another file (in
-which case you want to use the \ref XBT_LOG_EXTERNAL_CATEGORY macro to make
-it visible in the current file), but each category may have only one
-definition.
-      
-Typically, there will be a Category for each module and sub-module, so you
-can independently control logging for each module.
-
-<h3>Priority</h3>
-
-A category may be assigned a threshold priorty. The set of priorites are
-defined by the \ref e_xbt_log_priority_t enum. All logging request under
-this priority will be discarded.
-         
-If a given category is not assigned a threshold priority, then it inherits
-one from its closest ancestor with an assigned threshold. To ensure that all
-categories can eventually inherit a threshold, the root category always has
-an assigned threshold priority.
-
-Logging requests are made by invoking a logging macro on a category.  All of
-the macros have a printf-style format string followed by arguments. If you
-compile with the -Wall option, gcc will warn you for unmatched arguments, ie
-when you pass a pointer to a string where an integer was specified by the
-format. This is usualy a good idea.
-
-Because most C compilers do not support vararg macros, there is a version of
-the macro for any number of arguments from 0 to 6. The macro name ends with
-the total number of arguments.
-       
-Here is an example of the most basic type of macro. This is a logging
-request with priority <i>warning</i>.
-
-<code>CLOG5(MyCat, gras_log_priority_warning, "Values are: %d and '%s'", 5,
-"oops");</code>
-
-A logging request is said to be enabled if its priority is higher than or
-equal to the threshold priority of its category. Otherwise, the request is
-said to be disabled. A category without an assigned priority will inherit
-one from the hierarchy. 
-      
-It is possible to use any non-negative integer as a priority. If, as in the
-example, one of the standard priorites is used, then there is a convenience
-macro that is typically used instead. For example, the above example is
-equivalent to the shorter:
-
-<code>CWARN4(MyCat, "Values are: %d and '%s'", 5, "oops");</code>
-
-<h3>Default category</h3>
-  
-If \ref XBT_LOG_NEW_DEFAULT_SUBCATEGORY(MyCat, Parent) or
-\ref XBT_LOG_NEW_DEFAULT_CATEGORY(MyCat) is used to create the
-category, then the even shorter form can be used:
-
-<code>WARN3("Values are: %d and '%s'", 5, "oops");</code>
-
-Only one default category can be created per file, though multiple
-non-defaults can be created and used.
-
-<h3>Example</h3>
-
-Here is a more complete example:
-
-\verbatim
-#include "xbt/log.h"
-
-/ * create a category and a default subcategory * /
-XBT_LOG_NEW_CATEGORY(VSS);
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(SA, VSS);
-
-int main() {
-       / * Now set the parent's priority.  (the string would typcially be a runtime option) * /
-       xbt_log_control_set("SA.thresh=3");
-
-       / * This request is enabled, because WARNING &gt;= INFO. * /
-       CWARN2(VSS, "Low fuel level.");
-
-       / * This request is disabled, because DEBUG &lt; INFO. * /
-       CDEBUG2(VSS, "Starting search for nearest gas station.");
-
-       / * The default category SA inherits its priority from VSS. Thus,
-          the following request is enabled because INFO &gt;= INFO.  * /
-       INFO1("Located nearest gas station.");
-
-       / * This request is disabled, because DEBUG &lt; INFO. * /
-       DEBUG1("Exiting gas station search"); 
-}
-\endverbatim
-
-<h3>Configuration</h3>
-Configuration is typically done during program initialization by invoking
-the xbt_log_control_set() method. The control string passed to it typically
-comes from the command line. Look at the documentation for that function for
-the format of the control string.
-
-Any SimGrid program can furthermore be configured at run time by passing a
---xbt-log argument on the command line (--gras-log, --msg-log and
---surf-log are synonyms). You can provide several of those arguments to
-change the setting of several categories.
-
-<h3>Performance</h3>
-
-Clever design insures efficiency. Except for the first invocation, a
-disabled logging request requires an a single comparison of a static
-variable to a constant.
-
-There is also compile time constant, \ref XBT_LOG_STATIC_THRESHOLD, which
-causes all logging requests with a lower priority to be optimized to 0 cost
-by the compiler. By setting it to gras_log_priority_infinite, all logging
-requests are statically disabled and cost nothing. Released executables
-might be compiled with
-\verbatim-DXBT_LOG_STATIC_THRESHOLD=gras_log_priority_infinite\endverbatim
-    
-<h3>Appenders</h3>
-
-Each category has an optional appender. An appender is a pointer to a
-structure which starts with a pointer to a doAppend() function. DoAppend()
-prints a message to a log.
-
-When a category is passed a message by one of the logging macros, the
-category performs the following actions:
-
-  - if the category has an appender, the message is passed to the
-    appender's doAppend() function,
-  - if 'willLogToParent' is true for the category, the message is passed
-    to the category's parent.
-    
-By default, only the root category have an appender, and 'willLogToParent'
-is true for any other category. This situation causes all messages to be
-logged by the root category's appender.
-
-The default appender function currently prints to stderr, and no other one
-exist, even if more would be needed, like the one able to send the logs to a
-remote dedicated server, or other ones offering different output formats.
-This is on our TODO list for quite a while now, but your help would be
-welcome here.
-
-<h3>Misc and Caveats</h3>
-
-Do not use any of the macros that start with '_'.
-
-Log4J has a 'rolling file appender' which you can select with a run-time
-option and specify the max file size. This would be a nice default for
-non-kernel applications.
-
-Careful, category names are global variables.
-
-*/
-      
-
-    /** \defgroup XBT_error Error tracking support.
-     *  \ingroup XBT_ground
-     *  \brief This section describes a set of macros used to handle errors easily.
-     */
-/** \defgroup XBT_structs  Datatypes defined in the XBT
-    \ingroup XBT_API
-*/
-    /** \defgroup XBT_dict A generic dictionnary
-     *  \ingroup XBT_structs
-     *  \brief This section describes the API to a dictionnary structure that 
-     *  associates as string to a void* key. It is not a hash table and the 
-     *  internal data-structure rather looks like a tree.
-     */
-    /** \defgroup XBT_dynar A generic dynamic array
-     *  \ingroup XBT_structs
-     *  \brief This section describes the API to generic dynamic array (vector).
-     */
-    /** \defgroup XBT_fifo A generic workqueue
-     *  \ingroup XBT_structs
-     *  \brief This section describes the API to generic workqueue. These functions
-     *   provide the same kind of functionnality as dynamic arrays but in time O(1). 
-     *   However these functions use malloc/free a way too much often.
-     */
-    /** \defgroup XBT_set A generic set datatype
-     *  \ingroup XBT_structs
-     *  \brief A data container consisting in \ref XBT_dict and \ref XBT_dynar
-     */
-    /** \defgroup XBT_swag A specific set datatype
-     *  \ingroup XBT_structs
-     *  \brief a O(1) set based on linked lists
-     *
-     *  Warning, this module is done to be efficient and performs tons of
-     *  cast and dirty things. So avoid using it unless you really know
-     *  what you are doing. It is basically a fifo but with restrictions so that 
-     *  it can be used as a set. Any operation (add, remove, belongs) is O(1) and 
-     *  no call to malloc/free is done.
-     */
-    /** \defgroup XBT_heap A generic heap data structure
-     *  \ingroup XBT_structs
-     *  \brief This section describes the API to generic heap with O(log(n)) access.
-     */
-     
-/** \defgroup XBT_port     Portability support defined in the XBT (you shouldn't use it directly)
-    \ingroup XBT_API
-*/
-    /** \defgroup XBT_context User-level context library
-     *  \ingroup XBT_port
-     *  \brief This section describes how to use high-level functions 
-     *  (as opposed to <tt>setjump/longjmp</tt>) to schedule non-preemptible 
-     *  threads.
-     */
-    /** \defgroup XBT_sysdep All system dependency
-     *  \ingroup XBT_port
-     *  \brief This section describes many macros/functions that can serve as
-     *  an OS abstraction.
-     */
-
+/**    \defgroup XBT_port     Portability support defined in the XBT 
+                              (you shouldn't use it directly) 
+       \ingroup XBT_API        */
+/**       \addtogroup XBT_context 
+          \ingroup XBT_port    */
+/**       \addtogroup XBT_sysdep
+          \ingroup XBT_port    */
 
 /** \defgroup SURF_API       SURF (simulator kernel)
- *  \ingroup SimGrid_API
- *  \brief Kernel of all the simulators used in SimGrid, and associated models.
- *
+    \ingroup SimGrid_API
+    \brief Kernel of all the simulators used in SimGrid, and associated models.
  
* SURF provides the core functionnalities to simulate a virtual
* platform. It is very low-level and is not intended to be used as
* such but rather to serve as a basis for higher-level simulators.
- * We're still working on it and the structure is a little bit complex. 
* So we'll document it only when we'll be completely satisfied of 
* the way it is organized.
- *
* It is where platform models are encoded. If you need a model that is not 
- * encoded yet, please tell me (<arnaud.legrand@imag.fr>) and we'll see if
* it is feasible or not (hopefully it should be but who knows).
- *
- * Please note that as it is not really intended for public use, this module
* is only partially documented.
- */
     SURF provides the core functionnalities to simulate a virtual
     platform. It is very low-level and is not intended to be used as
     such but rather to serve as a basis for higher-level simulators.
+      We're still working on it and the structure is a little bit
     complex. So we'll document it only when we'll be completely satisfied of 
     the way it is organized.
+
     It is where platform models are encoded. If you need a model that is not 
+      encoded yet, please tell me (<arnaud.legrand@imag.fr>) and we'll
     see if it is feasible or not (hopefully it should be but who knows).
+
+      Please note that as it is not really intended for public use,
     this module is only partially documented.
+*/
 
 /** \defgroup MSG_API      MSG
- *  \ingroup SimGrid_API
- *  \brief Simple programming environment 
- *
- *  MSG was the first distributed programming environment provided within
- *  SimGrid. While almost realistic, it remains quite simple (simplistic?).
- *
- *  You should use this model if you want to study some heuristics for a
- *  given problem you don't really want to implement. If you want to get a
- *  real implementation of your solution, have a look at the \ref GRAS_API 
- *  programming environment. If you want to study an existing MPI program,
- *  have a look at the \ref SMPI_API one. If none of those programming
- *  environments fits your needs, you may consider implementing your own 
- *  directly on top of \ref SURF_API (but you probably want to contact us
- *  before). 
- *
- */
-    /** \defgroup m_datatypes_management MSG Data Types
-     *  \ingroup MSG_API
-     *  \brief This section describes the different datatypes provided by MSG.
-     *
-     */
-
-    /** \defgroup m_process_management Management Functions of Agents
-     *  \ingroup MSG_API
-     *  \brief This section describes the agent structure of MSG
-     *  (#m_process_t) and the functions for managing it.
-     *
-     *  We need to simulate many independent scheduling decisions, so
-     *  the concept of <em>process</em> is at the heart of the
-     *  simulator. A process may be defined as a <em>code</em>, with
-     *  some <em>private data</em>, executing in a <em>location</em>.
-     *  \see m_process_t
-     */
-
-    /** \defgroup m_host_management    Management Functions of Hosts
-     *  \ingroup MSG_API
-     *  \brief This section describes the host structure of MSG
-     * (#m_host_t) and the functions for managing it.
-     *  
-     *  A <em>location</em> (or <em>host</em>) is any possible place where
-     *  a process may run. Thus it may be represented as a
-     *  <em>physical resource with computing capabilities</em>, some
-     *  <em>mailboxes</em> to enable running process to communicate with
-     *  remote ones, and some <em>private data</em> that can be only
-     *  accessed by local process.
-     *  \see m_host_t
-     */
-
-    /** \defgroup m_task_management    Management Functions of Tasks
-     *  \ingroup MSG_API
-     *  \brief This section describes the task structure of MSG
-     *  (#m_task_t) and the functions for managing it.
-     *
-     *  Since most scheduling algorithms rely on a concept of task
-     *  that can be either <em>computed</em> locally or
-     *  <em>transferred</em> on another processor, it seems to be the
-     *  right level of abstraction for our purposes. A <em>task</em>
-     *  may then be defined by a <em>computing amount</em>, a
-     *  <em>message size</em> and some <em>private data</em>.
-     */
-
-    /** \defgroup msg_gos_functions    MSG Operating System Functions
-     *  \ingroup MSG_API
-     *  \brief This section describes the functions that can be used
-     *  by an agent for handling some task.
-     */
-
-    /** \defgroup m_channel_management    Understanding channels
-     *  \ingroup MSG_API
-     *  \brief This section briefly describes the channel notion of MSG
-     *  (#m_channel_t).
-     *
-     *  For convenience, the simulator provides the notion of channel
-     *  that is close to the tag notion in MPI. A channel is not a
-     *  socket. It doesn't need to be opened neither closed. It rather
-     *  corresponds to the ports opened on the different machines.
-     */
+    \ingroup SimGrid_API
+    \brief Simple programming environment 
+  
+      MSG was the first distributed programming environment provided within
+      SimGrid. While almost realistic, it remains quite simple (simplistic?).
 
-    /** \defgroup msg_easier_life      Platform and Application management
-     *  \ingroup MSG_API
-     *  \brief This section describes functions to manage the platform creation
-     *  and the application deployment. You should also have a look at 
-     *  \ref MSG_examples  to have an overview of their usage.
-     */
+      \section MSG_who Who should use this (and who shouldn't)
+      
+      You should use this model if you want to study some heuristics for a
+      given problem you don't really want to implement. If you want to get a
+      real implementation of your solution, have a look at the \ref GRAS_API 
+      programming environment. If you want to study an existing MPI program,
+      have a look at the \ref SMPI_API one. If none of those programming
+      environments fits your needs, you may consider implementing your own 
+      directly on top of \ref SURF_API (but you probably want to contact us
+      before). 
+*/
+/**     \addtogroup m_datatypes_management
+        \ingroup MSG_API  */
+/**     \addtogroup m_process_management
+        \ingroup MSG_API  */
+/**     \addtogroup m_host_management
+        \ingroup MSG_API  */
+/**     \addtogroup m_task_management
+        \ingroup MSG_API  */
+/**     \addtogroup msg_gos_functions
+        \ingroup MSG_API  */
+/**     \addtogroup m_channel_management
+        \ingroup MSG_API  */
+/**     \addtogroup msg_easier_life
+        \ingroup MSG_API  */
+/**     \addtogroup msg_simulation
+        \ingroup MSG_API  */
 
-    /** \defgroup msg_simulation       MSG simulation Functions
-     *  \ingroup MSG_API
-     *  \brief This section describes the functions you need to know to
-     *  set up a simulation. You should have a look at \ref MSG_examples 
-     *  to have an overview of their usage.
-     */
 
 /** \defgroup GRAS_API      GRAS
- *  \ingroup SimGrid_API
- *  \brief Realistic programming environment (Grid Reality And Simulation)
- *
- *  GRAS provide a complete API to implement distributed application on top
- *  of heterogeneous plateforms. In addition to the SimGrid implementation
- *  of this interface (allowing you to work on your application within the
- *  comfort of the simulator), an implementation suited to real platforms is
- *  also provided (allowing you to really use your application once you're
- *  done with developing it).
- *
- *  GRAS thus constitute a complete grid application developement framework,
- *  encompassing both developer helping tools (the simulator and associated
- *  tools) and an efficient while portable execution runtime.
- *
- *  You should use this programming environment if you want to develop real
- *  applications, ie if the final result of your work is a program which 
- *  may eventually be distributed. 
- *  If you just want to study some heuristics for a given problem you don't
- *  want to implement really (ie, if your result would be a theorem), have a
- *  look at the \ref MSG_API one.
- *  If you want to study an existing MPI program, have a look at the 
- *  \ref SMPI_API one. 
- *  If none of those programming environments fits your needs, you may
- *  consider implementing your own directly on top of \ref SURF_API (but you
- *  probably want to contact us before).
- *
- *  The user visibile features tend to offer several kind of functionnalities:
- *   - <b>Communication facilities</b>: Exchanging messages between peers
- *   - <b>Virtualization</b>: Running both on top of the simulator and on
- *     top of real platforms, and portability support.
- */
+    \ingroup SimGrid_API
+    \brief Realistic programming environment (Grid Reality And Simulation)
+  
+    GRAS provide a complete API to implement distributed application on top
+    of heterogeneous plateforms. In addition to the SimGrid implementation
+    of this interface (allowing you to work on your application within the
+    comfort of the simulator), an implementation suited to real platforms is
+    also provided (allowing you to really use your application once you're
+    done with developing it).
+  
+    GRAS thus constitute a complete grid application developement framework,
+    encompassing both developer helping tools (the simulator and associated
+    tools) and an efficient while portable execution runtime.
+  
+    \section GRAS_who Who should use this (and who shouldn't)
+    
+    You should use this programming environment if you want to develop real
+    applications, ie if the final result of your work is a program which 
+    may eventually be distributed. 
+    If you just want to study some heuristics for a given problem you don't
+    want to implement really (ie, if your result would be a theorem), have a
+    look at the \ref MSG_API one.
+    If you want to study an existing MPI program, have a look at the 
+    \ref SMPI_API one. 
+    If none of those programming environments fits your needs, you may
+    consider implementing your own directly on top of \ref SURF_API (but you
+    probably want to contact us before).
+  
+    \section GRAS_funct Offered functionnalities
+     - <b>Communication facilities</b>: Exchanging messages between peers
+       - \ref GRAS_dd: any data which may transit on the network must be
+         described beforehand so that GRAS can handle the platform
+         heterogeneity and convert them if needed.
+       - \ref GRAS_sock: this is how to open a communication channel to
+         other processes, and retrive information about them.
+       - \ref GRAS_msg: communications are message oriented. You have to
+         describe all possible messages and their payload beforehand, and
+         can then attach callbacks to the arrival of a given kind of message. 
+     - <b>Virtualization</b>: Running both on top of the simulator and on
+       top of real platforms, and portability support.
+       - \ref GRAS_globals: The use of globals is forbidden since the
+         "processes" are threads in simulation mode. \n
+        This is how to let GRAS handle your globals properly.
+       - \ref GRAS_cond: How to declare specific code for the simulation mode
+          or for the real mode.
+       - \ref GRAS_virtu: You naturally don't want to call the
+          gettimeofday(2) function in simulation mode since it would give
+          you the time on the host running the simulation, not the time in
+          the simulated world (you are belonging to).\n
+         This a system call virtualization layer, which also acts as a
+          portability layer.
+         
+    \section GRAS_todo TODO
+     Documentation related:
+       - Add an example to the \ref GRAS_msg section, at least
+       - Document examples/gras/gras_stub_generator utility and how to deal
+         with the fact that programs must have a main in RL and not in SG.
+       - Document example/gras/ping as it uses almost all of the GRAS
+         features.
      
-   /** \defgroup GRAS_dd     Data description
-    *  \ingroup GRAS_API
-    *  \brief Describing data to be exchanged (Communication facility)
-    */
-       
-   /** \defgroup GRAS_sock   Sockets
-    *  \ingroup GRAS_API
-    *  \brief Open/close sockets, and get info on peer (Communication facility).
-    */
-       
-   /** \defgroup GRAS_msg    Messages
-    *  \ingroup GRAS_API
-    *  \brief Defining messages and callbacks, and sending/receiving messages (Communication facility).
-    */
-
-   /** \defgroup GRAS_globals Globals
-    *  \ingroup GRAS_API
-    *  \brief Handling global variables so that it works on simulator (Virtualization).
-    *
-    *  In GRAS, using globals is forbidden since the "processes" will
-    *  sometimes run as a thread inside the same process (namely, in
-    *  simulation mode). So, you have to put all globals in a structure, and
-    *  let GRAS handle it.
-    *  
-    *  Use the \ref gras_userdata_new macro to create a new user data (or malloc it
-    *   and use \ref gras_userdata_set yourself), and \ref gras_userdata_get to
-    *   retrive a reference to it.
-    */
+     Code related: too long to be written here. See the TODO file
+     
+    @{
+*/     
 
-   /** \defgroup GRAS_virtu Syscalls
-    *  \ingroup GRAS_API
-    *  \brief System call abstraction layer (Virtualization).
-    */
+       /** \defgroup GRAS_dd      Data description      */       
+       /** \defgroup GRAS_sock    Sockets               */           
+       /** \defgroup GRAS_msg     Messages              */               
+        
+       /** \defgroup GRAS_globals Globals               */ 
+       /** \defgroup GRAS_cond    Conditional execution */ 
+       /** \defgroup GRAS_virtu   Syscalls              */ 
 
+/** @} */ 
 
 /** \defgroup SMPI_API      SMPI
- *  \ingroup SimGrid_API
- *  \brief Programming environment for the simulation of MPI applications
- *
- *  Once implemented, this programming environment will allow you to study
- *  within the simulator any MPI application without having to modify them
- *  for that. In other words, it will constitute an emulation solution for
- *  parallel codes.
- *  
- *  You should use this programming environment of the SimGrid suite if you
- *  want to study existing MPI applications.
- *  If you want to work on a distributed application, have a look at the 
- *  \ref GRAS_API environment. 
- *  If you want to study some heuristics for a given problem (and if your
- *  goal is to produce theorems, not code), have a look at the \ref MSG_API
- *  environment.
- *  If none of those programming environments fits your needs, you may
- *  consider implementing your own directly on top of \ref SURF_API (but you
- *  probably want to contact us before).
- *
+    \ingroup SimGrid_API
+    \brief Programming environment for the simulation of MPI applications
+  
+    Once implemented, this programming environment will allow you to study
+    within the simulator any MPI application without having to modify them
+    for that. In other words, it will constitute an emulation solution for
+    parallel codes.
+    
+    \section SMPI_who Who should use this (and who shouldn't)
+    
+    You should use this programming environment of the SimGrid suite if you
+    want to study existing MPI applications.
+    If you want to work on a distributed application, have a look at the 
+    \ref GRAS_API environment. 
+    If you want to study some heuristics for a given problem (and if your
+    goal is to produce theorems, not code), have a look at the \ref MSG_API
+    environment.
+    If none of those programming environments fits your needs, you may
+    consider implementing your own directly on top of \ref SURF_API (but you
+    probably want to contact us before).
+  
  */