1 /*
2   This file is part of MADNESS.
3 
4   Copyright (C) 2007,2010 Oak Ridge National Laboratory
5 
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2 of the License, or
9   (at your option) any later version.
10 
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14   GNU General Public License for more details.
15 
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software
18   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 
20   For more information please contact:
21 
22   Robert J. Harrison
23   Oak Ridge National Laboratory
24   One Bethel Valley Road
25   P.O. Box 2008, MS-6367
26 
27   email: harrisonrj@ornl.gov
28   tel:   865-241-3937
29   fax:   865-572-0680
30 */
31 
32 #include <madness/mra/mra.h>
33 #define MPRAIMPLX
34 #include <madness/mra/mraimpl.h>
35 #include <madness/world/world_object.h>
36 #include <madness/world/worldmutex.h>
37 #include <list>
38 
39 #ifdef FUNCTION_INSTANTIATE_6
40 namespace madness {
41 
42     template void plotdx<double,6>(const Function<double,6>&, const char*, const Tensor<double>&,
43                                    const std::vector<long>&, bool binary);
44     template void plotdx<double_complex,6>(const Function<double_complex,6>&, const char*, const Tensor<double>&,
45                                            const std::vector<long>&, bool binary);
46 
47     template void fcube<double,6>(const Key<6>&, const FunctionFunctorInterface<double,6>&, const Tensor<double>&, Tensor<double>&);
48     template Tensor<double> fcube<double, 6>(Key<6> const&, double (*)(Vector<double, 6> const&), Tensor<double> const&);
49     template void fcube<std::complex<double>,6>(const Key<6>&, const FunctionFunctorInterface<std::complex<double>,6>&, const Tensor<double>&, Tensor<std::complex<double> >&);
50     template Tensor<std::complex<double> > fcube<std::complex<double>, 6>(Key<6> const&, std::complex<double> (*)(Vector<double, 6> const&), Tensor<double> const&);
51 
52     template <> volatile std::list<detail::PendingMsg> WorldObject<FunctionImpl<double,6> >::pending = std::list<detail::PendingMsg>();
53     template <> Spinlock WorldObject<FunctionImpl<double,6> >::pending_mutex(0);
54     template <> volatile std::list<detail::PendingMsg> WorldObject<madness::FunctionImpl<std::complex<double>, 6> >::pending = std::list<detail::PendingMsg>();
55     template <> Spinlock WorldObject<FunctionImpl<std::complex<double>, 6> >::pending_mutex(0);
56 
57     template <> volatile std::list<detail::PendingMsg> WorldObject<WorldContainerImpl<Key<6>, FunctionNode<double, 6>, Hash<Key<6> > > >::pending = std::list<detail::PendingMsg>();
58     template <> Spinlock WorldObject<WorldContainerImpl<Key<6>, FunctionNode<double, 6>, Hash<Key<6> > > >::pending_mutex(0);
59     template <> volatile std::list<detail::PendingMsg> WorldObject<WorldContainerImpl<Key<6>, FunctionNode<std::complex<double>, 6>, Hash<Key<6> > > >::pending = std::list<detail::PendingMsg>();
60     template <> Spinlock WorldObject<WorldContainerImpl<Key<6>, FunctionNode<std::complex<double>, 6>, Hash<Key<6> > > >::pending_mutex(0);
61 
62     template <> volatile std::list<detail::PendingMsg> WorldObject<DerivativeBase<double,6> >::pending = std::list<detail::PendingMsg>();
63     template <> Spinlock WorldObject<DerivativeBase<double,6> >::pending_mutex(0);
64     template <> volatile std::list<detail::PendingMsg> WorldObject<DerivativeBase<std::complex<double>,6> >::pending = std::list<detail::PendingMsg>();
65     template <> Spinlock WorldObject<DerivativeBase<std::complex<double>,6> >::pending_mutex(0);
66 
67     template <> volatile std::list<detail::PendingMsg> WorldObject<madness::SeparatedConvolution<double,6> >::pending = std::list<detail::PendingMsg>();
68     template <> Spinlock madness::WorldObject<madness::SeparatedConvolution<double,6> >::pending_mutex(0);
69     template <> volatile std::list<detail::PendingMsg> WorldObject<madness::SeparatedConvolution<std::complex<double>,6> >::pending = std::list<detail::PendingMsg>();
70     template <> Spinlock madness::WorldObject<madness::SeparatedConvolution<std::complex<double>,6> >::pending_mutex(0);
71 
72     template <> volatile std::list<detail::PendingMsg> WorldObject<WorldContainerImpl<Key<6>, LBNodeDeux<6>, Hash<Key<6> > > >::pending = std::list<detail::PendingMsg>();
73     template <>  Spinlock WorldObject<WorldContainerImpl<Key<6>, LBNodeDeux<6>, Hash<Key<6> > > >::pending_mutex(0);
74 
75     // These implicit instantiations must be below the explicit ones above in order not to offend LLVM
76     template class FunctionDefaults<6>;
77     template class Function<double, 6>;
78     template class Function<std::complex<double>, 6>;
79     template class FunctionImpl<double, 6>;
80     template class FunctionImpl<std::complex<double>, 6>;
81     template class FunctionCommonData<double, 6>;
82     template class FunctionCommonData<double_complex, 6>;
83     template class Displacements<6>;
84     template class DerivativeBase<double,6>;
85     template class DerivativeBase<double_complex,6>;
86 
87 }
88 #endif
89