ergo
integrals_2el_J.cc File Reference

Code for computing the Coulomb matrix J. More...

#include <cstring>
#include <cstdio>
#include <cassert>
#include <pthread.h>
#include "integrals_2el_J_kernel.h"
#include "integrals_2el_J.h"
#include "integrals_2el_utils.h"
#include "mm_limit_table.h"
#include "basis_func_pair_list.h"
#include "integrals_2el_repeating.h"
#include "integrals_hermite.h"
#include "integrals_general.h"
#include "utilities.h"
#include "pi.h"
#include "integrals_2el_util_funcs.h"
#include "integrals_2el_J_mm_utils.h"
#include "integrals_2el_J_mm_kernel.h"

Classes

struct  job_list_standard_entry_J_struct
 
struct  job_list_multipole_entry_J_struct
 
struct  J_std_joblist_thread_struct
 
struct  JFMMWorkerData
 

Functions

static int add_multipole_jobs_for_2_boxes_branches_recursive (int multipoleBoxIndex, int multipoleBranchIndex, const box_struct *boxList, int boxIndex, int branchIndex, int numberOfLevels, int currLevel, job_list_multipole_entry_J_struct *jobList_multipole, int maxNoOfJobs_multipole)
 
static int get_joblists_J_for_two_boxes_recursive (const IntegralInfo &integralInfo, ergo_real threshold, const box_struct *boxList, int numberOfLevels, int currLevel, int boxIndex_1, int boxIndex_2, int branchIndex_1, int branchIndex_2, job_list_standard_entry_J_struct *jobList_standard, int maxNoOfJobs_standard, int *noOfNewJobs_standard, job_list_multipole_entry_J_struct *jobList_multipole, int maxNoOfJobs_multipole, int *noOfNewJobs_multipole)
 
static int get_list_of_labeled_distrs_maxLimitingFactor_linear (const BasisInfoStruct &basisInfo, const IntegralInfo &integralInfo, ergo_real threshold, const basis_func_index_pair_struct *basisFuncIndexPairList, int basisFuncIndexPairCount, ergo_real *resultMaxLimitingFactor)
 
static int get_list_of_labeled_distrs_linear (const BasisInfoStruct &basisInfo, const IntegralInfo &integralInfo, ergo_real threshold, DistributionSpecStructLabeled *resultList, int maxCountDistrs, ergo_real maxLimitingFactor, const basis_func_index_pair_struct *basisFuncIndexPairList, int basisFuncIndexPairCount, const ergo_real *D_list)
 
static int compare_multipole_jobs (const void *p1, const void *p2)
 
static void get_largest_and_smallest_extent_for_list_of_distributions (int n, const DistributionSpecStructLabeled *distrList, ergo_real *result_extent_min, ergo_real *result_extent_max)
 
static int get_branch_splitter_info (ergo_real *branchSplitterList, int maxNoOfBranches, const JK::Params &J_K_params, ergo_real toplevelBoxSize, ergo_real extent_max)
 
static int create_branches (int noOfBranches, const ergo_real *branchSplitterList, int distrCount, DistributionSpecStructLabeled *distrListOrdered, int noOfBoxesTopLevel, box_struct *boxListTopLevel)
 
static int execute_joblist_J_std_serial (int noOfJobs_J_standard, const job_list_standard_entry_J_struct *jobList_J_standard, const IntegralInfo &integralInfo, int maxNoOfMonomials, ergo_real *result_J_list, const box_struct *boxList, ergo_real threshold)
 
static void * execute_joblist_J_std_thread_func (void *arg)
 
static int execute_joblist_J_std_threaded (int noOfThreads, int noOfJobs_J_standard, const job_list_standard_entry_J_struct *jobList_J_standard, const IntegralInfo &integralInfo, int maxNoOfMonomials, ergo_real *result_J_list, int noOfBasisFuncIndexPairs, const box_struct *boxList, ergo_real threshold)
 
static int sort_list_of_multipole_jobs_fixed_boxIndex (job_list_multipole_entry_J_struct *jobList, int n)
 
static int sort_list_of_multipole_jobs (std::vector< job_list_multipole_entry_J_struct > &jobList, int n)
 
static int execute_joblist_J_fmm_shared (int jobIndexLo, int jobIndexHi, const IntegralInfo &integralInfo, const JK::Params &J_K_params, const job_list_multipole_entry_J_struct *jobList_J_multipole, const box_struct *boxList, int maxnoOfMinimalDistrsPerBoxBranch, ergo_real *result_J_list, int *largest_L_used)
 executes given jobList using FMM. More...
 
static int execute_joblist_J_fmm_serial (const IntegralInfo &integralInfo, const JK::Params &J_K_params, int noOfJobs_J_multipole, const job_list_multipole_entry_J_struct *jobList_J_multipole, const box_struct *boxList, int maxnoOfMinimalDistrsPerBoxBranch, ergo_real *result_J_list)
 
static void * execute_J_fmm_worker (void *arg)
 
static int execute_joblist_J_fmm_thread (int noOfThreads, int noOfBasisFuncIndexPairs, const IntegralInfo &integralInfo, const JK::Params &J_K_params, int noOfJobs_J_multipole, const job_list_multipole_entry_J_struct *jobList_J_multipole, const box_struct *boxList, int maxnoOfMinimalDistrsPerBoxBranch, ergo_real *result_J_list)
 Compute the FMM part of the Coulomb matrix using threads. More...
 
int compute_J_by_boxes_linear (const BasisInfoStruct &basisInfo, const IntegralInfo &integralInfo, const JK::Params &J_K_params, const basis_func_index_pair_struct *basisFuncIndexPairList, int basisFuncIndexPairCount, const ergo_real *D_list, ergo_real *result_J_list, int noOfBasisFuncIndexPairs)
 Computes the Coulomb interaction. More...
 
int compute_J_by_boxes (const BasisInfoStruct &basisInfo, const IntegralInfo &integralInfo, const JK::Params &J_K_params, ergo_real *J, const ergo_real *dens)
 
int compute_J_by_boxes_nosymm (const BasisInfoStruct &basisInfo, const IntegralInfo &integralInfo, const JK::Params &J_K_params, ergo_real *J, const ergo_real *dens)
 

Variables

static const int HUGE_INTEGER_NUMBER = 2000000000
 

Detailed Description

Code for computing the Coulomb matrix J.

Author
: Elias Rudberg responsible.

Function Documentation

◆ add_multipole_jobs_for_2_boxes_branches_recursive()

static int add_multipole_jobs_for_2_boxes_branches_recursive ( int  multipoleBoxIndex,
int  multipoleBranchIndex,
const box_struct boxList,
int  boxIndex,
int  branchIndex,
int  numberOfLevels,
int  currLevel,
job_list_multipole_entry_J_struct jobList_multipole,
int  maxNoOfJobs_multipole 
)
static

◆ compare_multipole_jobs()

◆ compute_J_by_boxes()

◆ compute_J_by_boxes_linear()

int compute_J_by_boxes_linear ( const BasisInfoStruct basisInfo,
const IntegralInfo integralInfo,
const JK::Params J_K_params,
const basis_func_index_pair_struct basisFuncIndexPairList,
int  basisFuncIndexPairCount,
const ergo_real D_list,
ergo_real result_J_list,
int  noOfBasisFuncIndexPairs 
)

Computes the Coulomb interaction.

Parameters
basisInfo
integralInfo
J_K_paramsthe evaluation parameters, thresholds and all.
basisFuncIndexPairList
basisFuncIndexPairCountthe length of basisFuncIndexPairList.
D_listbasisFuncIndexPairCount elements, with indices matching basisFuncIndexPairList.
result_J_listpreallocated list that will contain the results.
noOfBasisFuncIndexPairsthe length of result_J_list. happens to be always equal to basisFuncIndexPairCount

References box_struct::basicBox, BoxSystem::boxList, box_struct::branchCountListForJ, box_struct::branchIndexListForJ, box_struct::branchListForJ, distr_org_mm_struct::Data::chargeSum, combine_mm_info_for_child_boxes(), compute_extent_for_list_of_distributions(), create_box_system_and_reorder_distrs(), create_branches(), distr_org_struct::data, distr_org_mm_struct::data, do_output(), execute_joblist_J_fmm_serial(), execute_joblist_J_fmm_thread(), execute_joblist_J_std_serial(), execute_joblist_J_std_threaded(), box_struct_basic::firstChildBoxIndex, JK::Params::fmm_box_size, generate_multipoles_for_groups(), get_branch_splitter_info(), get_joblists_J_for_two_boxes_recursive(), get_largest_and_smallest_extent_for_list_of_distributions(), get_list_of_labeled_distrs_linear(), get_list_of_labeled_distrs_maxLimitingFactor_linear(), get_max_abs_vector_element(), get_multipole_pt_for_box(), IntegralInfo::GetMultipolePrep(), distr_org_struct::groupList, HUGE_INTEGER_NUMBER, BoxSystem::levelList, LOG_AREA_INTEGRALS, LOG_CAT_ERROR, LOG_CAT_INFO, MAX_MULTIPOLE_DEGREE, MAX_NO_OF_BRANCHES, distr_org_struct::Data::maxNoOfMonomials, distr_org_struct::minimalDistrList, BasisInfoStruct::noOfBasisFuncs, box_level_struct::noOfBoxes, box_struct_basic::noOfChildBoxes, BoxSystem::noOfLevels, JK::Params::noOfThreads_J, distr_list_description_struct::org, distr_list_description_struct::org_mm, organize_distributions(), output_current_memory_usage(), Util::TimeMeter::print(), sort_list_of_multipole_jobs(), box_level_struct::startIndexInBoxList, JK::Params::threshold_J, BoxSystem::totNoOfBoxes, translate_multipoles_for_box(), JK::Params::use_fmm, and box_struct_basic::width.

Referenced by compute_J_by_boxes(), and compute_J_by_boxes_sparse().

◆ compute_J_by_boxes_nosymm()

int compute_J_by_boxes_nosymm ( const BasisInfoStruct basisInfo,
const IntegralInfo integralInfo,
const JK::Params J_K_params,
ergo_real J,
const ergo_real dens 
)

◆ create_branches()

◆ execute_J_fmm_worker()

◆ execute_joblist_J_fmm_serial()

static int execute_joblist_J_fmm_serial ( const IntegralInfo integralInfo,
const JK::Params J_K_params,
int  noOfJobs_J_multipole,
const job_list_multipole_entry_J_struct jobList_J_multipole,
const box_struct boxList,
int  maxnoOfMinimalDistrsPerBoxBranch,
ergo_real result_J_list 
)
static

◆ execute_joblist_J_fmm_shared()

static int execute_joblist_J_fmm_shared ( int  jobIndexLo,
int  jobIndexHi,
const IntegralInfo integralInfo,
const JK::Params J_K_params,
const job_list_multipole_entry_J_struct jobList_J_multipole,
const box_struct boxList,
int  maxnoOfMinimalDistrsPerBoxBranch,
ergo_real result_J_list,
int *  largest_L_used 
)
static

executes given jobList using FMM.

Parameters
jobIndexLothe first jobindex for which this thread is responsible.
jobIndexHithe last jobindex for which this thread is responsible is jobIndexHi-1.
integralInfoinfo needed for evaluation of integrals of Gaussian functions.
J_K_paramsincludes various parameters for J and K matrix construction.
jobList_J_multipolelist of multipole-jobs.
boxListlist of boxes.
maxnoOfMinimalDistrsPerBoxBranchneeded to determine size of work buffer.
result_J_listthe list of matrix elements to be updated.
largest_L_usedlargest L-value used (output).

References job_list_multipole_entry_J_struct::boxIndex, job_list_multipole_entry_J_struct::branchIndex, box_struct::branchListForJ, create_list_of_multipoles_for_box(), distr_org_mm_struct::data, do_multipole_interaction_between_2_boxes_branches(), do_output(), IntegralInfo::GetMMLimitTable(), IntegralInfo::GetMultipolePrep(), LOG_AREA_INTEGRALS, LOG_CAT_ERROR, LOG_CAT_INFO, MAX_NO_OF_MOMENTS_PER_MULTIPOLE, multipole_struct_large::momentList, distr_org_mm_struct::Data::multipole, JK::Params::multipole_threshold_factor, job_list_multipole_entry_J_struct::multipoleBoxIndex, job_list_multipole_entry_J_struct::multipoleBranchIndex, distr_list_description_struct::org_mm, output_current_memory_usage(), setup_multipole_maxAbsMomentList(), and JK::Params::threshold_J.

Referenced by execute_J_fmm_worker(), and execute_joblist_J_fmm_serial().

◆ execute_joblist_J_fmm_thread()

static int execute_joblist_J_fmm_thread ( int  noOfThreads,
int  noOfBasisFuncIndexPairs,
const IntegralInfo integralInfo,
const JK::Params J_K_params,
int  noOfJobs_J_multipole,
const job_list_multipole_entry_J_struct jobList_J_multipole,
const box_struct boxList,
int  maxnoOfMinimalDistrsPerBoxBranch,
ergo_real result_J_list 
)
static

Compute the FMM part of the Coulomb matrix using threads.

0th thread reuses result_J_list, all the other threads need to have temporary memory allocated.

References do_output(), execute_J_fmm_worker(), LOG_AREA_INTEGRALS, LOG_CAT_ERROR, LOG_CAT_INFO, and Util::TimeMeter::print().

Referenced by compute_J_by_boxes_linear().

◆ execute_joblist_J_std_serial()

◆ execute_joblist_J_std_thread_func()

◆ execute_joblist_J_std_threaded()

◆ get_branch_splitter_info()

◆ get_joblists_J_for_two_boxes_recursive()

static int get_joblists_J_for_two_boxes_recursive ( const IntegralInfo integralInfo,
ergo_real  threshold,
const box_struct boxList,
int  numberOfLevels,
int  currLevel,
int  boxIndex_1,
int  boxIndex_2,
int  branchIndex_1,
int  branchIndex_2,
job_list_standard_entry_J_struct jobList_standard,
int  maxNoOfJobs_standard,
int *  noOfNewJobs_standard,
job_list_multipole_entry_J_struct jobList_multipole,
int  maxNoOfJobs_multipole,
int *  noOfNewJobs_multipole 
)
static

◆ get_largest_and_smallest_extent_for_list_of_distributions()

static void get_largest_and_smallest_extent_for_list_of_distributions ( int  n,
const DistributionSpecStructLabeled distrList,
ergo_real result_extent_min,
ergo_real result_extent_max 
)
static

◆ get_list_of_labeled_distrs_linear()

◆ get_list_of_labeled_distrs_maxLimitingFactor_linear()

static int get_list_of_labeled_distrs_maxLimitingFactor_linear ( const BasisInfoStruct basisInfo,
const IntegralInfo integralInfo,
ergo_real  threshold,
const basis_func_index_pair_struct basisFuncIndexPairList,
int  basisFuncIndexPairCount,
ergo_real resultMaxLimitingFactor 
)
static

◆ sort_list_of_multipole_jobs()

static int sort_list_of_multipole_jobs ( std::vector< job_list_multipole_entry_J_struct > &  jobList,
int  n 
)
static

◆ sort_list_of_multipole_jobs_fixed_boxIndex()

static int sort_list_of_multipole_jobs_fixed_boxIndex ( job_list_multipole_entry_J_struct jobList,
int  n 
)
static

Variable Documentation

◆ HUGE_INTEGER_NUMBER

const int HUGE_INTEGER_NUMBER = 2000000000
static