void
NonlinearFluidMaterial :: computeDeviatoricStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &eps, TimeStep *tStep)
{
    NonlinearFluidMaterialStatus *status = static_cast< NonlinearFluidMaterialStatus * >( this->giveStatus(gp) );

    double normeps2;

    answer = eps;
    if ( eps.giveSize() == 3 ) {
        normeps2 = eps.at(1) * eps.at(1) + eps.at(2) * eps.at(2) + 0.5 * ( eps.at(3) * eps.at(3) );
        answer.at(3) *= 0.5;
    } else if ( eps.giveSize() == 4 ) {
        normeps2 = eps.at(1) * eps.at(1) + eps.at(2) * eps.at(2) + eps.at(3) * eps.at(3) + 0.5 * ( eps.at(4) * eps.at(4) );
        answer.at(4) *= 0.5;
    } else {
        normeps2 = eps.at(1) * eps.at(1) + eps.at(2) * eps.at(2) + eps.at(3) * eps.at(3) + 0.5 * ( eps.at(4) * eps.at(4) + eps.at(5) * eps.at(5) +  eps.at(6) * eps.at(6) );
        answer.at(4) *= 0.5;
        answer.at(5) *= 0.5;
        answer.at(6) *= 0.5;
    }

    answer.times( 2.0 * viscosity * ( 1.0 + c * pow(normeps2, alpha * 0.5) ) );

    status->letTempDeviatoricStressVectorBe(answer);
    status->letTempDeviatoricStrainVectorBe(eps);
    status->letTempStrainNorm2Be(normeps2);
}
void
NonlinearFluidMaterial :: giveDeviatoricStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp,
                                                        TimeStep *tStep)
{
    FloatArray eps;
    double normeps2;

    NonlinearFluidMaterialStatus *status = static_cast< NonlinearFluidMaterialStatus * >( this->giveStatus(gp) );
    eps = status->giveTempDeviatoricStrainVector();
    normeps2 = status->giveTempStrainNorm2();

    answer.resize( eps.giveSize(), eps.giveSize() );
    answer.zero();
    for ( int i = 1; i <= answer.giveNumberOfRows(); i++ ) {
        answer.at(i, i) = 1.;
    }
    if ( eps.giveSize() == 3 ) {
        answer.at(3, 3) *= 0.5;
    } else if ( eps.giveSize() == 4 ) {
        answer.at(4, 4) *= 0.5;
    } else {
        answer.at(4, 4) *= 0.5;
        answer.at(5, 5) *= 0.5;
        answer.at(6, 6) *= 0.5;
    }

    if ( normeps2 != 0 ) {
        FloatMatrix op;
        if ( eps.giveSize() == 3 ) {
            eps.at(3) *= 0.5;
        } else if ( eps.giveSize() == 4 ) {
            eps.at(4) *= 0.5;
        } else {
            eps.at(4) *= 0.5;
            eps.at(5) *= 0.5;
            eps.at(6) *= 0.5;
        }
        op.beDyadicProductOf(eps, eps);
        answer.times( 2 * viscosity * ( 1 + c * pow(normeps2, alpha * 0.5) ) );
        answer.add(2 * viscosity * c * alpha * pow(normeps2, alpha * 0.5 - 1), op);
    } else {
        answer.times(2 * viscosity);
    }
}
void
NonlinearFluidMaterial :: computeDeviatoricStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &eps, TimeStep *tStep)
{
    NonlinearFluidMaterialStatus *status = static_cast< NonlinearFluidMaterialStatus * >( this->giveStatus(gp) );

    status->letTempDeviatoricStrainVectorBe(eps);

    double normeps;

    normeps = eps.at(1) * eps.at(1) + eps.at(2) * eps.at(2) + 0.5 * ( eps.at(3) * eps.at(3) );
    normeps = sqrt(normeps);

    answer = eps;

    answer.at(3) *= 0.5;
    answer.times( 2.0 * viscosity * ( 1.0 + c * pow(normeps, alpha) ) );

    status->letTempDeviatoricStressVectorBe(answer);
}
void
NonlinearFluidMaterial :: giveDeviatoricStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp,
                                                        TimeStep *atTime)
{
    FloatArray eps;
    double normeps = 0;

    FloatMatrix op, t2;

    NonlinearFluidMaterialStatus *status = static_cast< NonlinearFluidMaterialStatus * >( this->giveStatus(gp) );
    eps = status->giveTempDeviatoricStrainVector();

    eps.at(3) *= 0.5;

    normeps = eps.at(1) * eps.at(1) + eps.at(2) * eps.at(2) + 2 * ( eps.at(3) * eps.at(3) );
    normeps = sqrt(normeps);

    op.resize(3, 3);
    op.beDyadicProductOf(eps, eps);
    if ( normeps != 0 ) {
        op.times( 2 * viscosity * c * alpha * pow(normeps, alpha - 2) );
    } else {
        op.times(0);
    }

    t2.resize(3, 3);
    t2.zero();
    for ( int i = 1; i <= 3; i++ ) {
        if ( normeps != 0 ) {
            t2.at(i, i) = 2 * viscosity * ( 1 + c * pow(normeps, alpha) );
        } else {
            t2.at(i, i) = 2 * viscosity;
        }
    }

    t2.at(3, 3) *= 0.5;

    answer.resize(3, 3);
    answer.zero();
    answer.add(op);
    answer.add(t2);
}