199 double dev11, dev22, dev33 = 0., dev12, dev23 = 0., dev13 = 0.;
203 dev12 = dev.
at(3) * 0.5;
208 dev23 = dev.
at(4) * 0.5;
209 dev13 = dev.
at(5) * 0.5;
210 dev12 = dev.
at(6) * 0.5;
214 if (
id == D_u ||
id == V_u ) {
215 val = dx.
at(1) / 3.0 * vol;
217 val += dx.
at(1) * dev11 + dx.
at(2) * dev12;
220 val += dx.
at(3) * dev13;
222 }
else if (
id == D_v ||
id == V_v ) {
223 val = dx.
at(2) / 3.0 * vol + dx.
at(1) * dev12 + dx.
at(2) * dev22;
225 val += dx.
at(3) * dev23;
228 val = dx.
at(3) / 3.0 * vol + dx.
at(1) * dev13 + dx.
at(2) * dev23 + dx.
at(3) * dev33;
264 std :: unique_ptr< SparseLinearSystemNM > solver(
283 std :: unique_ptr< SparseMtrx > Kfp(
classFactory.createSparseMtrx(stype) );
284 Kfp->buildInternalStructure(rve, 1, fnum, pnum);
288 int neq = Kfp->giveNumberOfRows();
290 int npeq = Kfp->giveNumberOfColumns();
292 if ( npeq != ndev ) {
297 ddev_pert.
resize(ndev, ndev);
299 for (
int i = 1; i <= ndev; ++i ) {
300 int eqn = this->
devdman->giveDofWithID(
dev_id.at(i))->__givePrescribedEquationNumber();
301 ddev_pert.
at(eqn, i) = -1.0;
303 Kfp->times(ddev_pert, rhs_d);
309 rhs_p.
at(dvol_eq) = -1.0 * rve_size;
315 std :: unique_ptr< SparseMtrx > Kff(
classFactory.createSparseMtrx(stype) );
317 OOFEM_ERROR(
"MixedGradientPressureDirichlet :: computeTangents - Couldn't create sparse matrix of type %d\n", stype);
319 Kff->buildInternalStructure(rve, 1, fnum);
321 solver->solve(*Kff, rhs_p, s_p);
322 solver->solve(*Kff, rhs_d, s_d);
326 Cp = - s_p.
at(dvol_eq);
328 for (
int i = 1; i <= ndev; ++i ) {
329 Cd.
at(i) = s_d.
at(dvol_eq, i);
334 std :: unique_ptr< SparseMtrx > Kpf(
classFactory.createSparseMtrx(stype) );
335 std :: unique_ptr< SparseMtrx > Kpp(
classFactory.createSparseMtrx(stype) );
336 Kpf->buildInternalStructure(rve, 1, pnum, fnum);
337 Kpp->buildInternalStructure(rve, 1, pnum);
342 Kpp->
times(ddev_pert, tmpMat);
345 Ed.
times(1.0 / rve_size);
347 Ep.
times(1.0 / rve_size);
351 int nsd = this->
domain->giveNumberOfSpatialDimensions();
352 for (
int i = 1; i <= nsd; ++i ) {
362 for (
int j = 1; j <= nsd; ++j ) {
365 mean /= ( double ) nsd;
367 for (
int j = 1; j <= nsd; ++j ) {
int giveNextFreeDofID(int increment=1)
int giveNumberOfSpatialDimensions()
Returns number of spatial dimensions.
void assembleVector(FloatArray &answer, TimeStep *tStep, const VectorAssembler &va, ValueModeType mode, const UnknownNumberingScheme &s, Domain *domain, FloatArray *eNorms=NULL)