Skip to content
Snippets Groups Projects
Select Git revision
  • master default protected
  • feature/add-fft-interface
  • feature/expose-rnumber-from-simulations
  • feature/particle_state_generation_with_variable_box_size
  • feature/forcing-unit-test
  • feature/dealias-check2
  • bugfix/check_field_exists
  • feature/dealias-check
  • v3.x
  • feature/particles-vectorization
  • 6.2.4
  • 6.2.3
  • 6.2.2
  • 6.2.1
  • 6.2.0
  • 6.1.0
  • 6.0.0
  • 5.8.1
  • 5.8.0
  • 5.7.2
  • 5.7.1
  • 5.7.0
  • 5.6.0
  • 5.5.1
  • 5.5.0
  • 5.4.7
  • 5.4.6
  • 5.4.5
  • 5.4.4
  • 5.4.3
30 results

code_base.hpp

Blame
  • user avatar
    Chichi Lalescu authored
    078c6bff
    History
    code_base.hpp 4.21 KiB
    /**********************************************************************
    *                                                                     *
    *  Copyright 2017 Max Planck Institute                                *
    *                 for Dynamics and Self-Organization                  *
    *                                                                     *
    *  This file is part of bfps.                                         *
    *                                                                     *
    *  bfps 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.                             *
    *                                                                     *
    *  bfps 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 bfps.  If not, see <http://www.gnu.org/licenses/>       *
    *                                                                     *
    * Contact: Cristian.Lalescu@ds.mpg.de                                 *
    *                                                                     *
    **********************************************************************/
    
    
    
    #ifndef CODE_BASE_HPP
    #define CODE_BASE_HPP
    
    #include <cstdlib>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include "base.hpp"
    
    /** \class code_base
     *  \brief Defines basic timer and method to check stopping condition.
     *
     *  Any computational task will consist of a loop over temporal snapshots, be it
     *  a simulation or a postprocessing job.
     *  This class declares the three required methods (initialize, step and finalize
     *  functionalities).
     *  Implementation should be done in children classes, since it will be different
     *  for simulations or postprocessing jobs.
     *
     *  What the class actually implements is a basic timer (calls to system clock),
     *  and a method to check for a stopping condition.
     *  These are meant to be used by children classes as needed.
     */
    
    class code_base
    {
        private:
            clock_t time0, time1;
        public:
            int myrank, nprocs;
            MPI_Comm comm;
    
            std::string simname;
            int iteration;
    
            bool stop_code_now;
    
            int nx;
            int ny;
            int nz;
            int dealias_type;
            double dkx;
            double dky;
            double dkz;
    
            code_base(
                    const MPI_Comm COMMUNICATOR,
                    const std::string &simulation_name);
            virtual ~code_base(){}
    
            int check_stopping_condition(void);
    
            int start_simple_timer(void)
            {
                this->time0 = clock();
                return EXIT_SUCCESS;
            }
    
            int print_simple_timer(
                    const std::string operation_name)
            {
                this->time1 = clock();
                double local_time_difference = ((
                        (unsigned int)(this->time1 - this->time0)) /
                        ((double)CLOCKS_PER_SEC));
                double time_difference = 0.0;
                MPI_Allreduce(
                        &local_time_difference,
                        &time_difference,
                        1,
                        MPI_DOUBLE,
                        MPI_SUM,
                        MPI_COMM_WORLD);
                if (this->myrank == 0)
                    std::cout << operation_name <<
                                 " took " << time_difference/this->nprocs <<
                                 " seconds" << std::endl;
                if (this->myrank == 0)
                    std::cerr << operation_name <<
                                 " took " << time_difference/this->nprocs <<
                                 " seconds" << std::endl;
                this->time0 = this->time1;
                return EXIT_SUCCESS;
            }
    
            virtual int initialize(void) = 0;
            virtual int main_loop(void) = 0;
            virtual int finalize(void) = 0;
    };
    
    #endif//CODE_BASE_HPP