double CollisionD2Q9LPMWang::getPsi(double *fIn, int i, int j) {
    double ret = 0;
    for(int d = 0; d < 9; d++) {
        ret += fIn[d] + 0.5*g_rhs(i, j)*W[d];
    }
    return ret;
}
void CollisionD2Q9LPMWang::collide() {
    cout<<"WANG"<<endl;
    double dQ;

    for(int j = 0; j < n.y; j++) {
        for(int i = 0; i < n.x; i++) {
            psi[j][i] = getPsi(f[0][j][i], i, j);
            dQ = (1 - 0.5*w)*g_rhs(i, j);
            for(int d = 0; d < 9; d++) {
                f[0][j][i][d] += w*( fEq(d, psi[j][i]) - f[0][j][i][d] ) + W[d]*dQ;
            }
            psi[j][i] = getPsi(f[0][j][i], i, j);
        }
    }
}
void CollisionD2Q9LPMChai::collide() {
    UnitHandlerLPM *uh = dynamic_cast<UnitHandlerLPM*>(unitHandler);
    //cout<<"Chai collision"<<endl;
    for (int j = 0; j < n.y; j++) {
        for (int i = 0; i < n.x; i++) {
            psi[j][i] = getPsi(f[0][j][i], i, j);

            //if(skip != NULL && skip[j][i]) continue;
            //cout<<"psi: "<<psi[j][i]<<endl;
            for (int d = 0; d < 9; d++) {
                f[0][j][i][d] += w * (fEq(d, psi[j][i]) - f[0][j][i][d])
                                 + (0.5 - 1.0 / w) / 3.0 * Wa[d] * g_rhs(i, j) * uh->getTimeStep()
                                 * uh->getTimeStep();
            }
            psi[j][i] = getPsi(f[0][j][i], i, j);
        }
    }
}