#ifndef _A2A_ALLOC_POLICIES_H #define _A2A_ALLOC_POLICIES_H CPS_START_NAMESPACE template< typename mf_Policies> class A2AvectorV; template< typename mf_Policies> class A2AvectorVfftw; template< typename mf_Policies> class A2AvectorW; template< typename mf_Policies> class A2AvectorWfftw; struct ManualAllocStrategy{}; struct AutomaticAllocStrategy{}; template class A2AvectorV_autoAllocPolicies{ typedef typename mf_Policies::FermionFieldType FermionFieldType; protected: void allocInitializeFields(std::vector > &v, const typename FermionFieldType::InputParamType &field_setup_params){ for(int i=0;izero(); //initialize to zero } } public: typedef AutomaticAllocStrategy FieldAllocStrategy; }; template class A2AvectorV_manualAllocPolicies{ typedef typename mf_Policies::FermionFieldType FermionFieldType; typename FermionFieldType::InputParamType field_setup_params; std::vector > *vptr; protected: void allocInitializeFields(std::vector< PtrWrapper > &v, const typename FermionFieldType::InputParamType &_field_setup_params){ vptr = &v; field_setup_params = _field_setup_params; for(int i=0;i()); } (*vptr)[i]->zero(); } void freeMode(const int i){ if(!UniqueID()) printf("V freeMode %d %p\n",i,(*vptr)[i].operator->()); (*vptr)[i].free(); } void allocModes(){ for(int i=0;isize();i++) allocMode(i); } void freeModes(){ for(int i=0;isize();i++) freeMode(i); } typedef ManualAllocStrategy FieldAllocStrategy; }; template class A2AvectorVfftw_autoAllocPolicies{ typedef typename mf_Policies::FermionFieldType FermionFieldType; protected: void allocInitializeFields(std::vector > &v, const typename FermionFieldType::InputParamType &field_setup_params){ for(int i=0;izero(); //initialize to zero } } public: typedef AutomaticAllocStrategy FieldAllocStrategy; }; template class A2AvectorVfftw_manualAllocPolicies{ typedef typename mf_Policies::FermionFieldType FermionFieldType; typename FermionFieldType::InputParamType field_setup_params; std::vector > *vptr; protected: void allocInitializeFields(std::vector > &v, const typename FermionFieldType::InputParamType &_field_setup_params){ vptr = &v; field_setup_params = _field_setup_params; for(int i=0;i()); } } void freeMode(const int i){ if(!UniqueID()) printf("VFFT freeMode %d %p\n",i,(*vptr)[i].operator->()); (*vptr)[i].free(); } void allocModes(){ for(int i=0;isize();i++) allocMode(i); } void freeModes(){ for(int i=0;isize();i++) freeMode(i); } typedef ManualAllocStrategy FieldAllocStrategy; }; template class A2AvectorW_autoAllocPolicies{ typedef typename mf_Policies::FermionFieldType FermionFieldType; typedef typename mf_Policies::ComplexFieldType ComplexFieldType; protected: void allocInitializeLowModeFields(std::vector > &v, const typename FermionFieldType::InputParamType &field_setup_params){ for(int i=0;i > &v, const typename ComplexFieldType::InputParamType &field_setup_params){ for(int i=0;i class A2AvectorW_manualAllocPolicies{ typedef typename mf_Policies::FermionFieldType FermionFieldType; typedef typename mf_Policies::ComplexFieldType ComplexFieldType; typename FermionFieldType::InputParamType lfield_setup_params; typename ComplexFieldType::InputParamType hfield_setup_params; std::vector > *lptr; std::vector > *hptr; protected: void allocInitializeLowModeFields(std::vector > &v, const typename FermionFieldType::InputParamType &_field_setup_params){ lptr = &v; lfield_setup_params = _field_setup_params; for(int i=0;i > &v, const typename ComplexFieldType::InputParamType &_field_setup_params){ hptr = &v; hfield_setup_params = _field_setup_params; for(int i=0;isize();i++) allocLowMode(i); for(int i=0;isize();i++) allocHighMode(i); } void freeModes(){ for(int i=0;isize();i++) freeLowMode(i); for(int i=0;isize();i++) freeHighMode(i); } typedef ManualAllocStrategy FieldAllocStrategy; }; template class A2AvectorWfftw_autoAllocPolicies{ typedef typename mf_Policies::FermionFieldType FermionFieldType; protected: void allocInitializeLowModeFields(std::vector > &v, const typename FermionFieldType::InputParamType &field_setup_params){ for(int i=0;i > &v, const typename FermionFieldType::InputParamType &field_setup_params){ for(int i=0;i class A2AvectorWfftw_manualAllocPolicies{ typedef typename mf_Policies::FermionFieldType FermionFieldType; typename FermionFieldType::InputParamType field_setup_params; std::vector > *lptr; std::vector > *hptr; protected: void allocInitializeLowModeFields(std::vector > &v, const typename FermionFieldType::InputParamType &_field_setup_params){ lptr = &v; field_setup_params = _field_setup_params; for(int i=0;i > &v, const typename FermionFieldType::InputParamType &_field_setup_params){ hptr = &v; for(int i=0;isize();i++) allocLowMode(i); for(int i=0;isize();i++) allocHighMode(i); } void freeModes(){ for(int i=0;isize();i++) freeLowMode(i); for(int i=0;isize();i++) freeHighMode(i); } typedef ManualAllocStrategy FieldAllocStrategy; }; #define SET_A2AVECTOR_AUTOMATIC_ALLOC(PolicyType) \ typedef A2AvectorV_autoAllocPolicies A2AvectorVpolicies; \ typedef A2AvectorW_autoAllocPolicies A2AvectorWpolicies; \ typedef A2AvectorVfftw_autoAllocPolicies A2AvectorVfftwPolicies; \ typedef A2AvectorWfftw_autoAllocPolicies A2AvectorWfftwPolicies #define SET_A2AVECTOR_MANUAL_ALLOC(PolicyType) \ typedef A2AvectorV_manualAllocPolicies A2AvectorVpolicies; \ typedef A2AvectorW_manualAllocPolicies A2AvectorWpolicies; \ typedef A2AvectorVfftw_manualAllocPolicies A2AvectorVfftwPolicies; \ typedef A2AvectorWfftw_manualAllocPolicies A2AvectorWfftwPolicies CPS_END_NAMESPACE #endif