1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
/* Ergo, version 3.8, a program for linear scaling electronic structure
* calculations.
* Copyright (C) 2019 Elias Rudberg, Emanuel H. Rubensson, Pawel Salek,
* and Anastasia Kruchinina.
*
* This program 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.
*
* This program 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 <http://www.gnu.org/licenses/>.
*
* Primary academic reference:
* Ergo: An open-source program for linear-scaling electronic structure
* calculations,
* Elias Rudberg, Emanuel H. Rubensson, Pawel Salek, and Anastasia
* Kruchinina,
* SoftwareX 7, 107 (2018),
* <http://dx.doi.org/10.1016/j.softx.2018.03.005>
*
* For further information about Ergo, see <http://www.ergoscf.org>.
*/
/** @file scf.cc
@brief Code for classes containing various options related to
self-consistent field (SCF) calculations.
@author: Elias Rudberg <em>responsible</em>.
*/
#include <math.h>
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include "scf.h"
#include "basisinfo.h"
#include "molecule.h"
#include "output.h"
#include "utilities.h"
#include "matrix_utilities.h"
#include "AllocatorManager.h"
void SCF::MatOptions::prepare(const BasisInfoStruct& basisInfo)
{
if(use_allocator_manager)
{
int bufferSize = sparse_matrix_block_size * sparse_matrix_block_size;
mat::AllocatorManager<ergo_real>::instance().init(bufferSize, no_of_buffers_per_allocator);
}
size_block_info = prepareMatrixSizesAndBlocks(basisInfo.noOfBasisFuncs,
sparse_matrix_block_size,
sparse_matrix_block_factor_1,
sparse_matrix_block_factor_2,
sparse_matrix_block_factor_3);
getMatrixPermutation(basisInfo,
sparse_matrix_block_size,
sparse_matrix_block_factor_1,
sparse_matrix_block_factor_2,
sparse_matrix_block_factor_3,
permutationHML,
inversePermutationHML);
static const char *matOptionsInvalidInput =
"MatOptions: invalid number of OpenMP threads";
/* Set number of threads to use in matrix library. */
#ifdef _OPENMP
if (threads < 1) {
do_output(LOG_CAT_ERROR, LOG_AREA_MAIN,
"Error: Number of threads for matrix library less than one.");
throw matOptionsInvalidInput;
}
if (parallelLevel < 1) {
do_output(LOG_CAT_ERROR, LOG_AREA_MAIN,
"Error: Parallel level for matrix library less than one.");
throw matOptionsInvalidInput;
}
mat::Params::setNProcs((unsigned int)threads);
mat::Params::setMatrixParallelLevel((unsigned int)parallelLevel);
do_output(LOG_CAT_INFO, LOG_AREA_MAIN,
"OpenMP used in matrix library. Number of threads set to %i.",
mat::Params::getNProcs());
do_output(LOG_CAT_INFO, LOG_AREA_MAIN,
"OpenMP used in matrix library. Parallel level set to %i.",
mat::Params::getMatrixParallelLevel());
#else
if (threads != 1) {
do_output(LOG_CAT_ERROR, LOG_AREA_MAIN,
"Error: Number of threads for matrix library is set to %i. "
"Only one thread can be used when openmp is not used.",
threads);
throw matOptionsInvalidInput;
}
do_output(LOG_CAT_INFO, LOG_AREA_MAIN,
"OpenMP not used in matrix library. Number of threads set to 1.");
#endif
}
|