MPQC 3.0.0-alpha
Loading...
Searching...
No Matches
core_ints_engine.h
1//
2// core_ints_engine.h
3//
4// Copyright (C) 2014 Edward Valeev
5//
6// Author: Edward Valeev <evaleev@vt.edu>
7// Maintainer: EV
8//
9// This file is part of the SC Toolkit.
10//
11// The SC Toolkit is free software; you can redistribute it and/or modify
12// it under the terms of the GNU Library General Public License as published by
13// the Free Software Foundation; either version 2, or (at your option)
14// any later version.
15//
16// The SC Toolkit is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU Library General Public License for more details.
20//
21// You should have received a copy of the GNU Library General Public License
22// along with the SC Toolkit; see the file COPYING.LIB. If not, write to
23// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24//
25// The U.S. Government is granted a limited license as per AL 91-7.
26//
27
28#ifdef __GNUG__
29#pragma interface
30#endif
31
32#ifndef _mpqc_src_lib_chemistry_qc_libint2_core_ints_engine_h
33#define _mpqc_src_lib_chemistry_qc_libint2_core_ints_engine_h
34
35#include <util/ref/ref.h>
36#include <util/group/thread.h>
37
38namespace sc {
39
46 template <typename _Engine>
48 public:
49
50 struct Engine :
51 virtual public RefCount,
52 public _Engine
53 {
54 Engine(int mmax, double prec = 1e-15): RefCount(), _Engine(mmax, prec) {}
55 };
56
57 template <typename Int>
58 static Ref<Engine> instance(Int mmax) {
59 if (default_engine_->max_m() >= mmax)
60 return default_engine_;
61
62 ThreadLockHolder lh(lock_);
63 Ref<Engine> new_default_engine = new Engine(mmax);
64 default_engine_ = new_default_engine;
65 return default_engine_;
66 }
67
68 template <typename Int, typename Real>
69 static Ref<Engine> instance(Int mmax, Real prec) {
70 if (not (default_engine_->max_m() < mmax || default_engine_->precision() > prec))
71 return default_engine_;
72
73 ThreadLockHolder lh(lock_);
74 Ref<Engine> new_default_engine = new Engine(mmax, prec);
75 default_engine_ = new_default_engine;
76 return default_engine_;
77 }
78
79 private:
80 static Ref<Engine> default_engine_;
81 static Ref<ThreadLock> lock_;
82 };
83
84 template <typename _Engine>
85 Ref<ThreadLock> CoreIntsEngine<_Engine>::lock_ = ThreadGrp::get_default_threadgrp()->new_lock();
86
87} // end of namespace sc
88
89#endif // end of header guard
90
91
92// Local Variables:
93// mode: c++
94// c-file-style: "CLJ-CONDENSED"
95// End:
CoreIntsEngine manages Boys, and other core integral, engines.
Definition core_ints_engine.h:47
The base class for all reference counted objects.
Definition ref.h:192
A template class that maintains references counts.
Definition ref.h:361
virtual Ref< ThreadLock > new_lock()=0
Return a local object.
static ThreadGrp * get_default_threadgrp()
Returns the default ThreadGrp.
Acquire a lock on creation and release it on destruction.
Definition thread.h:56
Contains all MPQC code up to version 3.
Definition mpqcin.h:14
Definition core_ints_engine.h:53

Generated at Wed Sep 25 2024 02:45:29 for MPQC 3.0.0-alpha using the documentation package Doxygen 1.12.0.