00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00024 class fermi_field: public mdp_complex_field {
00025 public:
00026 int nspin, nc;
00027 fermi_field() {
00028 reset_field();
00029 }
00030 fermi_field(mdp_lattice &a, int nc_, int nspin_=4) {
00031 reset_field();
00032 nc=nc_;
00033 nspin=nspin_;
00034 allocate_field(a, nspin*nc);
00035 }
00036 void allocate_fermi_field(mdp_lattice &a, int nc_, int nspin_=4) {
00037 deallocate_field();
00038 nc=nc_;
00039 nspin=nspin_;
00040 allocate_field(a, nspin*nc);
00041 }
00042 fermi_field(const fermi_field &chi) : mdp_complex_field(chi) {
00043 nc=chi.nc;
00044 nspin=chi.nspin;
00045 }
00046 void operator=(const fermi_field &chi) {
00047 nc=chi.nc;
00048 nspin=chi.nspin;
00049 mdp_complex_field::operator=(chi);
00050 }
00051 inline mdp_matrix operator() (site x) {
00052 return mdp_matrix(address(x),nspin,nc);
00053 }
00054 inline mdp_matrix operator() (site x, int a) {
00055 return mdp_matrix(address(x,a*nc),nc,1);
00056 }
00057 inline mdp_complex& operator() (site x, int a, int i) {
00058 return *(address(x,a*nc+i));
00059 }
00060 inline const mdp_complex& operator() (site x, int a, int i) const {
00061 return *(address(x,a*nc+i));
00062 }
00063
00064 void operator= (mdp_complex a) {
00065 for(mdp_int i=0; i<size; i++) m[i]=a;
00066 }
00067
00068 };
00069
00070
00071
00072
00073
00074
00076
00077 void print_fermi_field(fermi_field &psi) {
00078 begin_function("print_fermi_field");
00079 int x0,x1,x2,x3;
00080 site x(psi.lattice());
00081 int do_exit=false;
00082 do {
00083 mdp << "\nCheck point!\n";
00084 mdp << "Here you called the function to print the propagator\n";
00085 mdp << "Enter the coordinates (x0,x1,x2,x3 or 'quit' to end): ";
00086 if(ME==0) {
00087 string stringa;
00088 cin >> stringa;
00089 if(stringa=="quit") do_exit=true;
00090 else sscanf(stringa.c_str(),"%i,%i,%i,%i", &x0,&x1,&x2,&x3);
00091 }
00092 mpi.broadcast(do_exit,0);
00093 if(do_exit==true) {
00094 mdp << '\n';
00095 break;
00096 }
00097 mpi.broadcast(x0,0);
00098 mpi.broadcast(x1,0);
00099 mpi.broadcast(x2,0);
00100 mpi.broadcast(x3,0);
00101 if(on_which_process(psi.lattice(),x0,x1,x2,x3)==ME) {
00102 x.set(x0,x1,x2,x3);
00103 mdp << psi(x);
00104 }
00105 } while(1);
00106 end_function("print_fermi_field");
00107 }
00108