Adding rate cap on vol link pressure

This commit is contained in:
jtclemm
2023-09-21 12:17:47 +02:00
parent 77a5fd16dd
commit 5ff16da272
2 changed files with 46 additions and 3 deletions

View File

@ -1297,6 +1297,8 @@ void FixDeform::set_volume()
double L2i = domain->boxhi[fixed] - domain->boxlo[fixed];
double L3i = domain->boxhi[dynamic1] - domain->boxlo[dynamic1];
double L3 = (set[dynamic1].hi_target - set[dynamic1].lo_target);
double Vi = L1i * L2i * L3i;
double V = L3 * L1i * L2i;
double e3 = (L3 / L3i - 1.0) / dt;
double p1 = pressure->vector[i];
double p2 = pressure->vector[fixed];
@ -1315,13 +1317,22 @@ void FixDeform::set_volume()
if (!linked_pressure) {
// Calculate first strain rate by expanding stress to linear order, p1(t+dt) = p2(t+dt)
// Calculate second strain rate to preserve volume
denominator = (p2 - p2i + (p1 - p1i) / e1i * e2i);
denominator = p2 - p2i + e2i * ((p1 - p1i) / e1i);
if (denominator != 0.0 && e1i != 0.0) {
e1 = (-e3 / (1 + e3 * dt) * (p2 - p2i) - e2i * (p1 - p2)) / denominator;
e1 = (((p2 - p2i) * (Vi - V) / (V * dt)) - e2i * (p1 - p2)) / denominator;
} else {
e1 = e2i;
}
e2 = (1.0 - (1 + e3 * dt) * (1 + e1 * dt)) / ((1 + e3 * dt) * (1 + e1 * dt) * dt);
e2 = (Vi - V * (1 + e1 * dt)) / (V * (1 + e1 * dt) * dt);
// If strain rate exceeds limit in either dimension, cap it at the maximum compatible rate
if (max_h_rate != 0)
if (fabs(e1) > max_h_rate || fabs(e2) > max_h_rate)
if (fabs(e1) > fabs(e2))
adjust_linked_rates(e1, e2, e3, Vi, V);
else
adjust_linked_rates(e2, e1, e3, Vi, V);
shift = 0.5 * L1i * (1.0 + e1 * dt);
linked_pressure = 1;
@ -1341,6 +1352,37 @@ void FixDeform::set_volume()
}
}
/* ----------------------------------------------------------------------
Rescale volume preserving strain rates to enforce max rate
------------------------------------------------------------------------- */
void FixDeform::adjust_linked_rates(double &e_larger, double &e_smaller, double e3, double Vi, double V)
{
double dt = update->dt;
double e_lim_positive = (Vi - V * (1 + max_h_rate * dt)) / (V * (1 + max_h_rate * dt) * dt);
double e_lim_negative = (Vi - V * (1 - max_h_rate * dt)) / (V * (1 - max_h_rate * dt) * dt);
if ((e_larger * e3) >= 0) {
if (e_larger > 0.0) {
// Same sign as primary strain rate, cap third dimension
e_smaller = -max_h_rate;
e_larger = e_lim_negative;
} else {
e_smaller = max_h_rate;
e_larger = e_lim_positive;
}
} else {
// Opposite sign, set to maxrate.
if (e_larger > 0.0) {
e_larger = max_h_rate;
e_smaller = e_lim_positive;
} else {
e_larger = -max_h_rate;
e_smaller = e_lim_negative;
}
}
}
/* ----------------------------------------------------------------------
apply isotropic controls
------------------------------------------------------------------------- */

View File

@ -88,6 +88,7 @@ class FixDeform : public Fix {
void set_volume();
void set_iso();
void couple();
void adjust_linked_rates(double&, double&, double, double, double);
};
} // namespace LAMMPS_NS