void CollisionD2Q9LNP::collide() {
  updateNi();
  // cout<<"D2Q9 LNP collision"<<endl;
  // cout<<"pe:"<<Pe<<endl;
  double pref = (PHYS_E_CHARGE * z) / (PHYS_KB * T * Pe);
//    cout<<"pref: "<<pref<<endl;
//    cout<<"dPsiY: "<<dPsiy[1][lm->n.x/2]<<endl;
//    cout<<"dPsiX: "<<dPsix[1][lm->n.x/2]<<endl;
//    cout<<"RHS: "<<rhs[1][lm->n.x/2]<<endl;
//    cout<<"F_2: "<<f[0][1][lm->n.x/2][2]<<endl;
//    cout<<"d2psi = "<<dPsiy[2][lm->n.x/2] - dPsiy[1][lm->n.x/2]<<" = "<<
//            (rhs[1][lm->n.x/2] + rhs[2][lm->n.x/2])*0.5<<endl;
//    cout<<"pref*dpsiy: "<<-dPsiy[1][lm->n.x/2]*pref<<endl;
  for (int j = 0; j < n.y; j++) {
    for (int i = 0; i < n.x; i++) {
      // cout<<"i: "<<i<<endl;
      // cout<<"j: "<<j<<endl;
      // if(skip != NULL && skip[j][i]){continue;}
      for (int d = 0; d < 9; d++) {
        f[0][j][i][d] += w
            * (fEq(d, ux[j][i] - pref * dPsix[j][i],
                uy[j][i] - pref * dPsiy[j][i], ni[j][i]) - f[0][j][i][d])
            + W[d] * colPrefactor * ni[j][i] * rhs[j][i];
        // cout<<"orig f: "<<w*( fEq(d, ux[j][i] - pref*dPsix[j][i],
        //          uy[j][i] - pref*dPsiy[j][i],
        //          ni[j][i]) - f[0][j][i][d] )<<endl;
        //  cout<<"extra f: "<<W[d] * colPrefactor *ni[j][i] * rhs[j][i]<<endl;
        //   cout<<"RHS: "<<rhs[j][i]<<endl;
      }
    }
  }
  updateNi();

  double sum = 0;
  double sumCol = 0;
  for (int j = 0; j < lm->n.y; j++) {
    sumCol += ni[j][lm->n.x / 2];
    for (int i = 0; i < lm->n.x; i++) {
      sum += ni[j][1];
    }
  }

  cout << "SUM: " << sum << ", SUMCOL: " << sumCol << ", SUM/3: " << sum / 3.0
      << endl;

}
void CollisionD2Q9LNPSource::collide(){
    cout<<"D2Q9 LNP with source collision"<<endl;
    cout<<"pe:"<<Pe<<endl;
    for(int j = 0; j < n.y; j++){
        for(int i = 0; i < n.x; i++){
            for(int d = 0; d < 9; d++){
                f[0][j][i][d] += w*( fEq(d, ux[j][i], uy[j][i], ni[j][i]) - f[0][j][i][d] ) +
                                 W[d] * colPrefactor * rhs[j][i];
            }
        }
    }

    updateNi();
}
void CollisionD2Q9LNPSource::init(){
    cout<<"init LNP with source..."<<endl;
    double initConc = 0.0;
    ni = allocate2DArray(lm->n.y, lm->n.x);
    rhs = allocate2DArray(lm->n.y, lm->n.x);
    for(int j = 0; j < lm->n.y; j++){
        for(int i = 0; i < lm->n.x; i++){
            for(int d = 0; d < lm->UDIRS; d++){
                f[0][j][i][d] = fEq(d, 0, 0, j*j);
            }
        }
    }

    double colPrefactor = ( 1 - 0.5 * w );

    updateNi();
}