/*
* vmg - a versatile multigrid solver
* Copyright (C) 2012 Institute for Numerical Simulation, University of Bonn
*
* vmg is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* vmg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
/**
* @file command.hpp
* @author Julian Iseringhausen
* @date Tue Apr 5 19:21:37 2011
*
* @brief Base class for commands that can be added to several
* command lists. Commands in the lists COMMANDLIST_INIT,
* COMMAND_LIST_LOOP and COMMANDLIST_FINALIZE will be
* executed automatically. However the user may create
* other command lists and execute them manually.
*
*/
#ifndef COMMAND_HPP_
#define COMMAND_HPP_
#include
#include
#include "base/defs.hpp"
#include "base/proxy.hpp"
#include "comm/comm.hpp"
#include "mg.hpp"
#ifdef HAVE_MPE
#include
#define MPE_EVENT_BEGIN() static int eventID_begin;\
static int eventID_end;\
if (eventID_begin == 0 && eventID_end == 0) {\
MPE_Log_get_state_eventIDs(&eventID_begin, &eventID_end);\
if (MG::GetComm()->GlobalRank() == 0)\
MPE_Describe_state(eventID_begin, eventID_end, Name(), "pink"); \
}\
MPE_Log_event(eventID_begin, 0, NULL);
#define MPE_EVENT_END() MPE_Log_event(eventID_end, 0, NULL);
#else
#define MPE_EVENT_BEGIN()
#define MPE_EVENT_END()
#endif /* HAVE_MPE */
#define CREATE_INITIALIZER(a) void Initialize##a() { \
VMG::MG::GetCommands().Register(new VMG::CommandProxy); \
}
namespace VMG
{
class Command
{
public:
typedef std::vector argument_vector; ///< Holds arguments for execution
virtual ~Command() {}
/**
* This function will be executed when command flow in a certain command
* list reaches this command.
*
* @param arguments Holds arguments for execution as strings. When using multiple arguments,
* ':' serves as the separator.
*
* @return Certain commands may want to change the following command flow of the command list
* (e.g. stopping criteria). This can be achieved by returning either "StopNow", which
* stops execution right after this command or by returning "StopLater", which will stop
* execution of a loop after the remaining commands have also been executed.
*/
virtual Request Run(Command::argument_vector arguments) = 0;
};
}
#endif /* COMMAND_HPP_ */