r12ia.h
//
// r12ia.h
//
// Copyright (C) 2002 Edward Valeev
//
// Author: Edward Valeev <edward.valeev@chemistry.gatech.edu>
// Maintainer: EV
//
// This file is part of the SC Toolkit.
//
// The SC Toolkit is free software; you can redistribute it and/or modify
// it under the terms of the GNU Library General Public License as published by
// the Free Software Foundation; either version 2, or (at your option)
// any later version.
//
// The SC Toolkit 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 Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public License
// along with the SC Toolkit; see the file COPYING.LIB. If not, write to
// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
//
// The U.S. Government is granted a limited license as per AL 91-7.
//
#ifndef _chemistry_qc_mbptr12_r12ia_h
#define _chemistry_qc_mbptr12_r12ia_h
#ifdef __GNUC__
#pragma interface
#endif
#include <vector>
#include <util/ref/ref.h>
#include <util/state/state.h>
#include <util/state/statein.h>
#include <util/state/stateout.h>
#include <util/group/memory.h>
using namespace std;
namespace sc {
class R12IntsAcc: virtual public SavableState {
int num_te_types_; // Number of types of integrals in a block (in R12 theories -- usually 3)
protected:
int ni_, nj_;
int nx_, ny_;
size_t nxy_; // nx_ * ny_ - the number of integrals of one type in a block
size_t blksize_; // the same in bytes
size_t blocksize_; // hence the size of the block of num_te_types of integrals is blksize_ * num_te_types
int next_orbital_; // The first index of the next batch to be stored
bool committed_; // Whether all data has been written out and ready to be read
bool active_; // Whether ready to read data
virtual int ntasks() const =0;
virtual int taskid() const =0;
void inc_next_orbital(int ni);
public:
R12IntsAcc(int num_te_types, int ni, int nj, int nx, int ny);
R12IntsAcc(StateIn&);
~R12IntsAcc();
void save_data_state(StateOut&);
enum tbint_type { eri=0, r12=1, r12t1=2, r12t2=3};
static const int max_num_te_types_ = 4;
int num_te_types() const { return num_te_types_; };
int ni() const { return ni_; }
int nj() const { return nj_; }
int nx() const { return nx_; }
int ny() const { return ny_; }
size_t blocksize() const { return blksize_; };
int next_orbital() const;
virtual void store_memorygrp(Ref<MemoryGrp>& mem, int ni, const size_t blksize = 0) =0;
virtual void store_pair_block(int i, int j, double *ints)=0;
virtual void commit();
bool is_committed() { return committed_; }
virtual void activate();
virtual void deactivate();
const bool is_active() { return active_; }
virtual double* retrieve_pair_block(int i, int j, tbint_type oper_type) =0;
virtual void release_pair_block(int i, int j, tbint_type oper_type) =0;
virtual bool is_local(int i, int j) const =0;
virtual bool is_avail(int i, int j) const =0;
virtual bool has_access(int proc) const =0;
int tasks_with_access(vector<int>& twa_map) const;
virtual bool can_restart() const =0;
};
}
#endif
// Local Variables:
// mode: c++
// c-file-style: "CLJ"
// End: