cleaned up comments

This commit is contained in:
William Zunker
2024-12-17 11:18:26 -05:00
parent 97f19d9d54
commit a7ba185a4c
16 changed files with 56 additions and 552 deletions

View File

@ -12,7 +12,7 @@ timestep 1e-6
######################### SIMULATION BOUNDING BOX, INTEGRATION, AND, GRAVITY ########################### ######################### SIMULATION BOUNDING BOX, INTEGRATION, AND, GRAVITY ###########################
boundary f f f boundary f f f
read_data spheres.data read_data spheres12.data
fix integr all nve/sphere fix integr all nve/sphere
########################### PARTICLE MATERIAL PROPERTIES AND FORCE MODEL ############################### ########################### PARTICLE MATERIAL PROPERTIES AND FORCE MODEL ###############################

View File

@ -1,21 +0,0 @@
#LAMMPS data file created by matlab.
10 atoms
1 atom types
-0.005000 0.005000 xlo xhi
-0.005000 0.005000 ylo yhi
-0.001000 0.020000 zlo zhi
Atoms
1 1 0.000249 1560.000000 0.000469 -0.000120 0.008380
2 1 0.000260 1560.000000 -0.001811 0.000425 0.004090
3 1 0.000225 1560.000000 -0.001371 0.000426 0.002952
4 1 0.000252 1560.000000 0.000928 -0.000089 0.004118
5 1 0.000210 1560.000000 0.000208 0.000384 0.000842
6 1 0.000218 1560.000000 -0.002456 -0.000587 0.003834
7 1 0.000201 1560.000000 -0.000278 0.003459 0.003445
8 1 0.000231 1560.000000 -0.002123 0.003188 0.004799
9 1 0.000268 1560.000000 -0.000338 -0.001557 0.007382
10 1 0.000244 1560.000000 0.002537 0.002151 0.005999

View File

@ -496,7 +496,6 @@ void FixWallGran::post_force(int /*vflag*/)
model->dx[2] = dz; model->dx[2] = dz;
model->radi = radius[i]; model->radi = radius[i];
model->radj = rwall; model->radj = rwall;
if (model->beyond_contact) model->touch = history_one[i][0]; if (model->beyond_contact) model->touch = history_one[i][0];
touchflag = model->check_contact(); touchflag = model->check_contact();

View File

@ -51,8 +51,8 @@ class FixWallGran : public Fix {
void reset_dt() override; void reset_dt() override;
// for granular model choices // for granular model choices
class Granular_NS::GranularModel *model; // MOVED HERE FROM PROTECTED FOR MDR MODEL class Granular_NS::GranularModel *model;
void clear_stored_contacts(); // MOVED HERE FROM PROTECTED FOR MDR MODEL void clear_stored_contacts();
protected: protected:
int wallstyle, wiggle, wshear, axis; int wallstyle, wiggle, wshear, axis;

View File

@ -29,7 +29,6 @@
#include "region.h" #include "region.h"
#include "update.h" #include "update.h"
#include "variable.h" #include "variable.h"
#include <iostream>
using namespace LAMMPS_NS; using namespace LAMMPS_NS;
using namespace Granular_NS; using namespace Granular_NS;
@ -130,8 +129,6 @@ void FixWallGranRegion::post_force(int /*vflag*/)
if (update->setupflag) history_update = 0; if (update->setupflag) history_update = 0;
model->history_update = history_update; model->history_update = history_update;
//std::cout << (uint64_t)this << ", " << (uint64_t)model << std::endl;
// if just reneighbored: // if just reneighbored:
// update rigid body masses for owned atoms if using FixRigid // update rigid body masses for owned atoms if using FixRigid
// body[i] = which body atom I is in, -1 if none // body[i] = which body atom I is in, -1 if none
@ -231,8 +228,8 @@ void FixWallGranRegion::post_force(int /*vflag*/)
model->radi = radius[i]; model->radi = radius[i];
model->radj = region->contact[ic].radius; model->radj = region->contact[ic].radius;
model->r = region->contact[ic].r; model->r = region->contact[ic].r;
model->i = i; // Added for MDR model->i = i;
model->j = ic; // Added for MDR model->j = ic;
if (model->beyond_contact) model->touch = history_many[i][c2r[ic]][0]; if (model->beyond_contact) model->touch = history_many[i][c2r[ic]][0];

View File

@ -44,13 +44,13 @@ class FixWallGranRegion : public FixWallGran {
int size_restart(int) override; int size_restart(int) override;
int maxsize_restart() override; int maxsize_restart() override;
class Region *region; // MOVED FROM PRIVATE TO PUBLIC FOR MDR MODEL class Region *region;
void update_contacts(int, int); // MOVED FROM PRIVATE TO PUBLIC FOR MDR MODEL void update_contacts(int, int);
int *ncontact; // MOVED FROM PRIVATE TO PUBLIC FOR MDR MODEL int tmax; // max # of region walls one particle can touch
int **walls; // MOVED FROM PRIVATE TO PUBLIC FOR MDR MODEL int *ncontact; // # of shear contacts per particle
int *c2r; // MOVED FROM PRIVATE TO PUBLIC FOR MDR MODEL int **walls; // which wall each contact is with
double ***history_many; // MOVED FROM PRIVATE TO PUBLIC FOR MDR MODEL double ***history_many; // history per particle per contact
int tmax; // MOVED FROM PRIVATE TO PUBLIC FOR MDR MODEL int *c2r; // contact to region mapping
private: private:
@ -59,8 +59,6 @@ class FixWallGranRegion : public FixWallGran {
// shear history for multiple contacts per particle // shear history for multiple contacts per particle
// c2r[i] = index of Ith contact in // c2r[i] = index of Ith contact in
// region-contact[] list of contacts // region-contact[] list of contacts
int motion_resetflag; // used by restart to indicate that region int motion_resetflag; // used by restart to indicate that region

View File

@ -17,11 +17,10 @@
#include "granular_model.h" #include "granular_model.h"
#include "math_const.h" #include "math_const.h"
#include "atom.h" #include "atom.h"
#include "csv_writer.h"
#include "update.h" #include "update.h"
#include "citeme.h"
#include <cmath> #include <cmath>
#include <iostream>
#include <iomanip> #include <iomanip>
#include <sstream> #include <sstream>
@ -38,6 +37,17 @@ static constexpr double INVROOT6 = 0.40824829046386307274; // 1/sqrt(6)
static constexpr double FOURTHIRDS = (4.0 / 3.0); // 4/3 static constexpr double FOURTHIRDS = (4.0 / 3.0); // 4/3
static constexpr double JKRPREFIX = 1.2277228507842888; // cbrt(3*PI**2/16) static constexpr double JKRPREFIX = 1.2277228507842888; // cbrt(3*PI**2/16)
static const char cite_mdr[] =
"MDR contact model command: \n\n"
"@Article\n"
" author = \n"
" title = \n"
" journal = ,\n"
" year = ,\n"
" volume = ,\n"
" pages = \n"
"}\n\n";
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
Default normal model Default normal model
------------------------------------------------------------------------- */ ------------------------------------------------------------------------- */
@ -399,6 +409,8 @@ void GranSubModNormalJKR::set_fncrit()
GranSubModNormalMDR::GranSubModNormalMDR(GranularModel *gm, LAMMPS *lmp) : GranSubModNormalMDR::GranSubModNormalMDR(GranularModel *gm, LAMMPS *lmp) :
GranSubModNormal(gm, lmp) GranSubModNormal(gm, lmp)
{ {
if (lmp->citeme) lmp->citeme->add(cite_mdr);
num_coeffs = 6; // Young's Modulus, Poisson's ratio, yield stress, effective surface energy, psi_b, coefficent of restitution num_coeffs = 6; // Young's Modulus, Poisson's ratio, yield stress, effective surface energy, psi_b, coefficent of restitution
contact_radius_flag = 1; contact_radius_flag = 1;
size_history = 26; size_history = 26;
@ -441,14 +453,15 @@ double GranSubModNormalMDR::calculate_forces()
// The MDR contact model was developed by imagining individual particles being // The MDR contact model was developed by imagining individual particles being
// squished between a number of rigid flats (references below). To allow // squished between a number of rigid flats (references below). To allow
// for many interacting particles, we extend the idea of isolated particles surrounded // for many interacting particles, we extend the idea of isolated particles surrounded
// by rigid flats. In particular, we imagine placing rigid flats at the overlap // by rigid flats. In particular, we imagine placing rigid flats at the overlaps
// midpoints between particles. The force is calculated seperately on both sides // between particles. The force is calculated seperately on both sides
// of the contact assuming interaction with a rigid flat. The two forces are then // of the contact assuming interaction with a rigid flat. The two forces are then
// averaged on either side of the contact to determine the final force. If the // averaged on either side of the contact to determine the final force. If the
// contact is between a particle and wall then only one force evaluation is required. // contact is between a particle and wall then only one force evaluation is required.
// //
// Zunker and Kamrin, 2024, Part I: https://doi.org/10.1016/j.jmps.2023.105492 // Zunker and Kamrin, 2024, Part I: https://doi.org/10.1016/j.jmps.2023.105492
// Zunker and Kamrin, 2024, Part II: https://doi.org/10.1016/j.jmps.2023.105493 // Zunker and Kamrin, 2024, Part II: https://doi.org/10.1016/j.jmps.2023.105493
// Zunker, Dunatunga, Thakur, Tang, and Kamrin, 2025:
const int itag_true = atom->tag[gm->i]; // true i particle tag const int itag_true = atom->tag[gm->i]; // true i particle tag
const int jtag_true = atom->tag[gm->j]; // true j particle tag const int jtag_true = atom->tag[gm->j]; // true j particle tag
@ -466,10 +479,6 @@ double GranSubModNormalMDR::calculate_forces()
int i1 = 0; int i1 = 0;
double delta = gm->delta; // apparent overlap double delta = gm->delta; // apparent overlap
//if (gm->contact_type == PAIR) delta = gm->delta/2.0; // half displacement to imagine interaction with rigid flat
//std::cout << "Normal force is called for: " << i_true << ", " << j_true << std::endl;
//std::cout << "Contact model has been entered " << gm->contact_type << ", " << PAIR << ", " << WALL << ", " << WALLREGION << ", " << gm->itype << ", " << gm->jtype << ", " << gm->delta << std::endl;
// initialize indexing in history array of different constact history variables // initialize indexing in history array of different constact history variables
const int delta_offset_0 = 0; // apparent overlap const int delta_offset_0 = 0; // apparent overlap
const int delta_offset_1 = 1; const int delta_offset_1 = 1;
@ -538,7 +547,6 @@ double GranSubModNormalMDR::calculate_forces()
double * contacts = atom->dvector[index_contacts]; double * contacts = atom->dvector[index_contacts];
double * adhesive_length = atom->dvector[index_adhesive_length]; double * adhesive_length = atom->dvector[index_adhesive_length];
double * history = & gm->history[history_index]; // load in all history variables double * history = & gm->history[history_index]; // load in all history variables
// Rigid flat placement scheme // Rigid flat placement scheme
@ -604,7 +612,6 @@ double GranSubModNormalMDR::calculate_forces()
double deltap = deltap0 + deltap1; double deltap = deltap0 + deltap1;
delta = delta_geo + (deltap0 - delta_geo)/(deltap - deltamax)*(gm->delta-deltamax); delta = delta_geo + (deltap0 - delta_geo)/(deltap - deltamax)*(gm->delta-deltamax);
//std::cout << "CS 0: " << gm->radi << ", " << gm->radj << ", gm->delta " << gm->delta << ", delta " << delta << ", deltamax " << deltamax << ", delta_geo " << delta_geo << ", delta_geo_alt " << delta_geo_alt << ", delta_geo/Ri " << delta_geo/gm->radi << ", delta_geo_alt/Rj " << delta_geo_alt/gm->radj << ", delta_geoOpt1 " << delta_geoOpt1 << ", delta_geoOpt2 " << delta_geoOpt2 << ", deltamax-delta " << (deltamax-gm->delta) << std::endl;
} }
delta_offset = & history[delta_offset_0]; delta_offset = & history[delta_offset_0];
deltao_offset = & history[deltao_offset_0]; deltao_offset = & history[deltao_offset_0];
@ -648,8 +655,6 @@ double GranSubModNormalMDR::calculate_forces()
double deltap = deltap0 + deltap1; double deltap = deltap0 + deltap1;
delta = delta_geo + (deltap1 - delta_geo)/(deltap - deltamax)*(gm->delta-deltamax); delta = delta_geo + (deltap1 - delta_geo)/(deltap - deltamax)*(gm->delta-deltamax);
//std::cout << "CS 1: " << gm->radi << ", " << gm->radj << ", gm->delta " << gm->delta << ", delta " << delta << ", deltamax " << deltamax << ", delta_geo " << delta_geo << ", delta_geo_alt " << delta_geo_alt << ", delta_geo/Ri " << delta_geo/gm->radi << ", delta_geo_alt/Rj " << delta_geo_alt/gm->radj << ", delta_geoOpt1 " << delta_geoOpt1 << ", delta_geoOpt2 " << delta_geoOpt2 << ", deltamax-delta " << (deltamax-gm->delta) << std::endl;
delta_offset = & history[delta_offset_1]; delta_offset = & history[delta_offset_1];
deltao_offset = & history[deltao_offset_1]; deltao_offset = & history[deltao_offset_1];
delta_MDR_offset = & history[delta_MDR_offset_1]; delta_MDR_offset = & history[delta_MDR_offset_1];
@ -668,8 +673,6 @@ double GranSubModNormalMDR::calculate_forces()
const int i = gm->i; const int i = gm->i;
const int j = gm->j; const int j = gm->j;
//std::cout << lmp->update->ntimestep << std::endl;
// material and geometric property definitions // material and geometric property definitions
// E, nu, Y gamma , psi_b, and CoR are already defined. // E, nu, Y gamma , psi_b, and CoR are already defined.
const double G = E/(2.0*(1.0+nu)); // shear modulus const double G = E/(2.0*(1.0+nu)); // shear modulus
@ -714,12 +717,6 @@ double GranSubModNormalMDR::calculate_forces()
} }
} }
//if (i_true == 167 && j_true == 204) {
//std::cout << "i " << i << " | j " << j << " | delta_BULK: " << delta_BULK << " | delta_MDR " << delta_MDR << " | ddelta_BULK " << ddelta_BULK << " | ddelta_MDR " << ddelta_MDR << std::endl;
//}
//std::cout << "Yield Flag: " << *Yflag_offset << ", " << R << std::endl;
// MDR force calculation // MDR force calculation
double F_MDR; double F_MDR;
double A; // height of elliptical indenter double A; // height of elliptical indenter
@ -746,32 +743,21 @@ double GranSubModNormalMDR::calculate_forces()
// added for rigid flat placement // added for rigid flat placement
*deltap_offset = deltamax_MDR - (deltae1Dmax + deltaR); *deltap_offset = deltamax_MDR - (deltae1Dmax + deltaR);
//std::cout << *deltap_offset << std::endl;
} }
//std::cout << psi_b << ", " << psi[i] << ", " << A << ", " << B << ", " << pY << ", " << amax << " || " << deltao << ", " << delta << ", " << ddelta << ", " << *delta_offset << ", " << ddelta_bar[i] << " || " << delta_MDR << ", " << ddelta_MDR << ", " << *delta_MDR_offset << ", " << deltamax_MDR << " || " << delta_BULK << ", " << ddelta_BULK << ", " << *delta_BULK_offset << " || " << R << std::endl;
//std::cout << i << ", " << j << ", " << A << ", " << B << " || " << deltao << ", " << delta << ", " << ddelta << ", " << R << ", " << MY_PI*pow(amax,2.0) << std::endl;
double a_na; double a_na;
double a_fac = 0.99; double a_fac = 0.99;
(deltae1D >= 0.0) ? a_na = B*sqrt(A - deltae1D)*sqrt(deltae1D)/A : a_na = 0.0; (deltae1D >= 0.0) ? a_na = B*sqrt(A - deltae1D)*sqrt(deltae1D)/A : a_na = 0.0;
double aAdh = *aAdh_offset; double aAdh = *aAdh_offset;
if (aAdh > a_fac*amax) aAdh = a_fac*amax; if (aAdh > a_fac*amax) aAdh = a_fac*amax;
//if (i_true == 4 && j_true == 52){
//std::cout << "CS: " << contactSide << ", aAdh: " << aAdh << ", deltae1D: " << deltae1D << ", A: " << A << ", B:" << B << ", amax: " << amax << ", deltae1D: " << deltae1D << ", R: " << R << std::endl;
//}
if ( gamma > 0.0 ) { // adhesive contact if ( gamma > 0.0 ) { // adhesive contact
double g_aAdh; double g_aAdh;
if (delta_MDR == deltamax_MDR || a_na >= aAdh ) { // case 1: no tensile springs, purely compressive contact if (delta_MDR == deltamax_MDR || a_na >= aAdh ) { // case 1: no tensile springs, purely compressive contact
(deltae1D <= 0.0) ? F_MDR = 0.0 : F_MDR = Eeff*(A*B/4.0)*(acos(1.0 - 2.0*deltae1D/A) - (1.0 - 2.0*deltae1D/A)*sqrt(4.0*deltae1D/A - 4.0*pow(deltae1D,2.0)/pow(A,2.0))); (deltae1D <= 0.0) ? F_MDR = 0.0 : F_MDR = Eeff*(A*B/4.0)*(acos(1.0 - 2.0*deltae1D/A) - (1.0 - 2.0*deltae1D/A)*sqrt(4.0*deltae1D/A - 4.0*pow(deltae1D,2.0)/pow(A,2.0)));
if ( std::isnan(F_MDR) ) { if ( std::isnan(F_MDR) ) {
std::cout << "F_MDR is NaN, case 1: no tensile springs" << std::endl; error->one(FLERR, "F_MDR is NaN, case 1: no tensile springs");
//std::cout << "Normal model: " << gm->delta << ", " << ddelta << ", " << gm->radi << ", " << gm->radj << " | delta: " << delta0 << ", " << delta1 << " | delta2_offset: " << *delta2_offset0 << ", " << *delta2_offset1 << "| dde: " << dde0 << ", " << dde1 << "| Fold: " << F0old << ", " << F1old << " | a: " << a0 << ", " << a1 << " | k_BULK: " << k_BULK0 << ", " << k_BULK1 << " | h_BULK: " << h_BULK0 << ", " << h_BULK1 << std::endl;
std::cout << "i_true: " << i_true << ", j_true: " << j_true << ", i_tag: " << atom->tag[i_true] << ", j_tag: " << atom->tag[j_true] << ", contact type: " << gm->contact_type << ", deltae1D: " << deltae1D << ", A: " << A << ", B: " << B << ", amax: " << amax << ", deltamax_MDR: " << deltamax_MDR << ", R: " << R << std::endl;
std::exit(1);
} }
*aAdh_offset = a_fac*a_na; *aAdh_offset = a_fac*a_na;
} else { } else {
@ -784,27 +770,19 @@ double GranSubModNormalMDR::calculate_forces()
pow(Eeff,2),0.3333333333333333))/pow(A,2))/6; pow(Eeff,2),0.3333333333333333))/pow(A,2))/6;
if ( (deltae1D + lmax - g_aAdh) >= 0.0) { // case 2: tensile springs, but not exceeding critical length --> deltae + lmax - g(aAdhes) >= 0 if ( (deltae1D + lmax - g_aAdh) >= 0.0) { // case 2: tensile springs, but not exceeding critical length --> deltae + lmax - g(aAdhes) >= 0
//if (contactSide == 0) {
//std::cout << "Case 2 tensile springs not exceeding critical length, R " << R << "deltae1D " << deltae1D << " , lmax " << lmax << " , g_adh" << g_aAdh << " sum " << (deltae1D + lmax - g_aAdh) << std::endl;
//}
const double deltaeAdh = g_aAdh; const double deltaeAdh = g_aAdh;
const double F_na = Eeff*(A*B/4.0)*(acos(1.0 - 2.0*deltaeAdh/A) - (1.0 - 2.0*deltaeAdh/A)*sqrt(4.0*deltaeAdh/A - 4.0*pow(deltaeAdh,2.0)/pow(A,2.0))); const double F_na = Eeff*(A*B/4.0)*(acos(1.0 - 2.0*deltaeAdh/A) - (1.0 - 2.0*deltaeAdh/A)*sqrt(4.0*deltaeAdh/A - 4.0*pow(deltaeAdh,2.0)/pow(A,2.0)));
const double F_Adhes = 2.0*Eeff*(deltae1D - deltaeAdh)*aAdh; const double F_Adhes = 2.0*Eeff*(deltae1D - deltaeAdh)*aAdh;
F_MDR = F_na + F_Adhes; F_MDR = F_na + F_Adhes;
if ( std::isnan(F_MDR) ) std::cout << "F_MDR is NaN, case 2: tensile springs, but not exceeding critical length" << std::endl; if ( std::isnan(F_MDR) ) error->one(FLERR, "F_MDR is NaN, case 2: tensile springs, but not exceeding critical length");
} else { // case 3: tensile springs exceed critical length --> deltae + lmax - g(aAdhes) = 0 } else { // case 3: tensile springs exceed critical length --> deltae + lmax - g(aAdhes) = 0
//if (contactSide == 0) {
//std::cout << "Case 3 tensile springs exceed critical length, R " << R << " deltae1D " << deltae1D << " , lmax " << lmax << " , g_adh " << g_aAdh << " sum " << (deltae1D + lmax - g_aAdh) << std::endl;
//}
if ( aAdh < acrit ) { if ( aAdh < acrit ) {
aAdh = 0.0; aAdh = 0.0;
F_MDR = 0.0; F_MDR = 0.0;
} else { } else {
// newton-raphson to find aAdh // newton-raphson to find aAdh
const double maxIterations = 100; const double maxIterations = 100;
const double error = 1e-10; const double error1 = 1e-10;
const double error2 = 1e-16; const double error2 = 1e-16;
double aAdh_tmp = aAdh; double aAdh_tmp = aAdh;
double fa; double fa;
@ -812,7 +790,7 @@ double GranSubModNormalMDR::calculate_forces()
double dfda; double dfda;
for (int lv1 = 0; lv1 < maxIterations; ++lv1) { for (int lv1 = 0; lv1 < maxIterations; ++lv1) {
fa = deltae1D + sqrt(2.0*MY_PI*aAdh_tmp*gamma/Eeff) - ( A/2 - A/B*sqrt(pow(B,2.0)/4 - pow(aAdh_tmp,2.0)) ); fa = deltae1D + sqrt(2.0*MY_PI*aAdh_tmp*gamma/Eeff) - ( A/2 - A/B*sqrt(pow(B,2.0)/4 - pow(aAdh_tmp,2.0)) );
if (abs(fa) < error) { if (abs(fa) < error1) {
break; break;
} }
dfda = -((aAdh_tmp*A)/(B*sqrt(-pow(aAdh_tmp,2.0) + pow(B,2.0)/4.0))) + (gamma*sqrt(MY_PI/2.0))/(Eeff*sqrt((aAdh_tmp*gamma)/Eeff)); dfda = -((aAdh_tmp*A)/(B*sqrt(-pow(aAdh_tmp,2.0) + pow(B,2.0)/4.0))) + (gamma*sqrt(MY_PI/2.0))/(Eeff*sqrt((aAdh_tmp*gamma)/Eeff));
@ -832,7 +810,7 @@ double GranSubModNormalMDR::calculate_forces()
const double F_na = Eeff*(A*B/4.0)*(acos(1.0 - 2.0*deltaeAdh/A) - (1.0 - 2.0*deltaeAdh/A)*sqrt(4.0*deltaeAdh/A - 4.0*pow(deltaeAdh,2.0)/pow(A,2.0))); const double F_na = Eeff*(A*B/4.0)*(acos(1.0 - 2.0*deltaeAdh/A) - (1.0 - 2.0*deltaeAdh/A)*sqrt(4.0*deltaeAdh/A - 4.0*pow(deltaeAdh,2.0)/pow(A,2.0)));
const double F_Adhes = 2.0*Eeff*(deltae1D - deltaeAdh)*aAdh; const double F_Adhes = 2.0*Eeff*(deltae1D - deltaeAdh)*aAdh;
F_MDR = F_na + F_Adhes; F_MDR = F_na + F_Adhes;
if ( std::isnan(F_MDR) ) std::cout << "F_MDR is NaN, case 3: tensile springs exceed critical length" << std::endl; if ( std::isnan(F_MDR) ) error->one(FLERR, "F_MDR is NaN, case 3: tensile springs exceed critical length");
} }
*aAdh_offset = aAdh; *aAdh_offset = aAdh;
} }
@ -841,15 +819,10 @@ double GranSubModNormalMDR::calculate_forces()
*aAdh_offset = a_na; *aAdh_offset = a_na;
(deltae1D <= 0.0) ? F_MDR = 0.0 : F_MDR = Eeff*(A*B/4.0)*(acos(1.0 - 2.0*deltae1D/A) - (1.0 - 2.0*deltae1D/A)*sqrt(4.0*deltae1D/A - 4.0*pow(deltae1D,2.0)/pow(A,2.0))); (deltae1D <= 0.0) ? F_MDR = 0.0 : F_MDR = Eeff*(A*B/4.0)*(acos(1.0 - 2.0*deltae1D/A) - (1.0 - 2.0*deltae1D/A)*sqrt(4.0*deltae1D/A - 4.0*pow(deltae1D,2.0)/pow(A,2.0)));
if ( std::isnan(F_MDR) ) { if ( std::isnan(F_MDR) ) {
std::cout << "F_MDR is NaN, non-adhesive case" << std::endl; error->one(FLERR, "F_MDR is NaN, non-adhesive case");
//std::cout << "Normal model: " << gm->delta << ", " << ddelta << ", " << gm->radi << ", " << gm->radj << " | delta: " << delta0 << ", " << delta1 << " | delta2_offset: " << *delta2_offset0 << ", " << *delta2_offset1 << "| dde: " << dde0 << ", " << dde1 << "| Fold: " << F0old << ", " << F1old << " | a: " << a0 << ", " << a1 << " | k_BULK: " << k_BULK0 << ", " << k_BULK1 << " | h_BULK: " << h_BULK0 << ", " << h_BULK1 << std::endl;
std::cout << "i_true: " << i_true << ", j_true: " << j_true << ", i_tag: " << atom->tag[i_true] << ", j_tag: " << atom->tag[j_true] << ", deltae1D: " << deltae1D << ", A: " << A << ", B: " << B << ", amax: " << amax << ", deltamax_MDR: " << deltamax_MDR << ", R: " << R << std::endl;
std::exit(1);
} }
} }
//std::cout << gm->i << ", " << gm->j << ", aAdh_offset: " << *aAdh_offset << ", aAdh: " << aAdh << ", a_na: " << a_na << std::endl;
contacts[i] += 1; contacts[i] += 1;
adhesive_length[i] += aAdh; adhesive_length[i] += aAdh;
@ -858,8 +831,6 @@ double GranSubModNormalMDR::calculate_forces()
double pij = *penalty_offset; double pij = *penalty_offset;
const double wij = std::max(1.0-pij,0.0); const double wij = std::max(1.0-pij,0.0);
//std::cout << gm->i << ", " << gm->j << ", " << gm->contact_type << ", " << *gm->xi[1] << ", " << *gm->xj[1] << std::endl;
// area related calculations // area related calculations
double Ac; double Ac;
(*Yflag_offset == 0.0) ? Ac = MY_PI*delta*R : Ac = MY_PI*((2.0*delta*R - pow(delta,2.0)) + cA/MY_PI); (*Yflag_offset == 0.0) ? Ac = MY_PI*delta*R : Ac = MY_PI*((2.0*delta*R - pow(delta,2.0)) + cA/MY_PI);
@ -871,80 +842,9 @@ double GranSubModNormalMDR::calculate_forces()
double F_BULK; double F_BULK;
(delta_BULK <= 0.0) ? F_BULK = 0.0 : F_BULK = (1.0/Vgeo[i])*Acon0[i]*delta_BULK*kappa*Ac; (delta_BULK <= 0.0) ? F_BULK = 0.0 : F_BULK = (1.0/Vgeo[i])*Acon0[i]*delta_BULK*kappa*Ac;
//if (atom->tag[i_true] == 4135 && lmp->update->ntimestep > 10935000 && gm->contact_type == 2) {
// std::cout << "CS: " << contactSide << ", i_true: " << i_true << ", j_true: " << j_true << ", i_tag: " << atom->tag[i_true] << ", j_tag: " << atom->tag[j_true] << ", deltae1D: " << deltae1D << ", A: " << A << ", B: " << B << ", amax: " << amax << ", deltamax_MDR: " << deltamax_MDR << ", R: " << R << ", F_MDR: " << F_MDR << ", F_BULK: " << F_BULK << ", wij: " << wij << ", gm->delta: " << gm->delta << ", delta: " << delta << ", delmax: " << deltamax << ", deltap: " << *deltap_offset << std::endl;
//}
//if (i == 35 && lmp->update->ntimestep % 1000 == 0) {
//double **x = atom->x;
//const double xi = x[i_true][0];
// std::cout << "i: " << i << ", j: " << j << "i_true: " << i_true << ", i_tag: " << atom->tag[i_true] << ", j_true: " << j_true << ", j_tag " << atom->tag[j_true] << ", radi_true: " << radi_true << ", radj_true " << radj_true << ", gm->radi: " << gm->radi << ", gm->radj: " << gm->radj << ", R: " << R << ", Ro: " << Ro << std::endl;
//}
//if (i_true == 35 && lmp->update->ntimestep >= 736002 && lmp->update->ntimestep <= 736005) {
// //double **x = atom->x;
// //const double xi = x[i_true][0];
// std::cout << "i_true: " << i_true << ", i_tag: " << atom->tag[i_true] << ", R: " << R << ", Ro: " << Ro << std::endl;
//}
//if ( ((atom->tag[i_true] == 4 && atom->tag[j_true] == 11) || (atom->tag[i_true] == 11 && atom->tag[j_true] == 4)) && lmp->update->ntimestep == 45000) {
// std::cout << "CS: " << contactSide << ", contact_type: " << gm->contact_type << ", pair: " << PAIR << ", wall: " << WALL << ", WALLREGION " << WALLREGION << ", itag_true: " << atom->tag[i_true] << ", jtag_true: " << atom->tag[j_true] << ", F_MDR: " << F_MDR << ", F_BULK: " << F_BULK << ", wij: " << wij << ", gm->delta: " << gm->delta << ", delta: " << delta << ", delmax: " << deltamax << ", deltap: " << *deltap_offset << std::endl;
//}
//if ( ((atom->tag[i_true] == 4301) || (atom->tag[j_true] == 4076)) && lmp->update->ntimestep > 1016700) {
// std::cout << "i: " << i << ", j: " << j << "i_true: " << i_true << ", i_tag: " << atom->tag[i_true] << ", j_true: " << j_true << ", j_tag " << atom->tag[j_true] << ", radi_true: " << radi_true << ", radj_true " << radj_true << ", gm->radi: " << gm->radi << ", gm->radj: " << gm->radj << ", R: " << R << ", Ro: " << Ro << ", F_MDR: " << F_MDR << ", F_BULK: " << F_BULK << ", wij: " << wij << ", gm->delta: " << gm->delta << ", delta: " << delta << ", delmax: " << deltamax << ", deltap: " << *deltap_offset << std::endl;
//}
//if ( ((atom->tag[i_true] == 4) || (atom->tag[j_true] == 4)) && lmp->update->ntimestep == 45000) {
// int rank = 0;
// MPI_Comm_rank(MPI_COMM_WORLD, &rank);
// double **x = atom->x;
// const double xi = x[i][0];
// const double xj = x[j][0];
// const double yi = x[i][1];
// const double yj = x[j][1];
// const double zi = x[i][2];
// const double zj = x[j][2];
// std::cout << "CS: " << contactSide << ", rank, " << rank << ", CT: " << gm->contact_type << ", itag_true: " << atom->tag[i_true] << ", jtag_true: " << atom->tag[j_true] << ", i: " << i << ", j: " << j << ", nlocal: " << atom->nlocal << ", nghost: " << atom->nghost << ", wij: " << wij << ", gm->delta: " << gm->delta << ", delta: " << delta << ", delmax: " << deltamax << ", deltap: " << *deltap_offset << ", R: " << R << ", xi: " << xi << ", xj: " << xj << ", yi: " << yi << ", yj: " << yj << ", zi: " << zi << ", zj: " << zj << std::endl;
//}
//int rank = 0;
//MPI_Comm_rank(MPI_COMM_WORLD, &rank);
//double **x = atom->x;
//const double xi = x[i][0];
//const double xj = x[j][0];
//const double yi = x[i][1];
//const double yj = x[j][1];
//const double zi = x[i][2];
//const double zj = x[j][2];
//const double dis = sqrt(pow((xi-xj),2.0) + pow((yi-yj),2.0) + pow((zi-zj),2.0));
//const double delta_test = gm->radi + gm->radj - dis;
//if (delta_test < 0.0 && gm->contact_type != 2) {
// std::cout << "Particles are not touching but a force is evaluated, CS: " << contactSide << ", rank, " << rank << ", contact_type: " << gm->contact_type << ", pair: " << PAIR << ", wall: " << WALL << ", WALLREGION " << WALLREGION << ", itag_true: " << atom->tag[i_true] << ", jtag_true: " << atom->tag[j_true] << ", i: " << i << ", j: " << j << ", nlocal: " << atom->nlocal << ", nghost: " << atom->nghost << ", wij: " << wij << ", gm->delta: " << gm->delta << ", delta: " << delta << ", delmax: " << deltamax << ", deltap: " << *deltap_offset << ", R: " << R << ", xi: " << xi << ", xj: " << xj << ", yi: " << yi << ", yj: " << yj << ", zi: " << zi << ", zj: " << zj << std::endl;
// std::exit(1);
//}
//if (F_BULK > 0.0) {
// std::cout << "F_BULK is: " << F_BULK << std::endl;
//}
//std::cout << delta_BULK << ", " << F_BULK << ", " << (1.0/Vgeo[i])*Acon0[i]*delta_BULK*kappa*Ac << std::endl;
//int rank = 0;
//MPI_Comm_rank(MPI_COMM_WORLD, &rank);
//std::cout << "Step: " << lmp->update->ntimestep << ", CS: " << contactSide << ", itag: " << atom->tag[i] << ", jtag: " << atom->tag[j] << ", rank: " << rank << ", gm->delta: " << gm->delta << ", delta: " << delta << ", ddelta: " << ddelta << ", delta_bar: " << ddelta_bar[i] << ", R: " << R << ", F_MDR: " << F_MDR << ", F_BULK: " << F_BULK << std::endl;
//std::cout << gm->i << ", " << gm->j << ", " << Vgeo[i] << ", " << Acon0[i] << ", " << Acon1[i] << ", " << Ac << ", " << kappa << " || " << psi[i] << ", " << ddelta_bar[i] << ", " << ddelta << ", " << ddelta_MDR << ", " << ddelta_BULK << ", " << delta << ", " << delta_MDR << ", " << delta_BULK << ", " << F_MDR << ", " << F_BULK << ", " << R << " || " << deltae1D << ", " << A << ", " << B << std::endl;
//std::cout << gm->i << ", " << gm->j << ", " << (1.0/Vgeo[i])*Acon0[i]*delta_BULK*kappa*Ac << std::endl;
// total force calculation // total force calculation
(contactSide == 0) ? F0 = F_MDR + F_BULK : F1 = F_MDR + F_BULK; (contactSide == 0) ? F0 = F_MDR + F_BULK : F1 = F_MDR + F_BULK;
//std::cout << gm->i << ", " << gm->j << " | " << deltao << ", " << ddelta_bar[i] << ", " << R << ", " << psi[i] << ", " << psi_b << ", " << Ac << " | " << pij << ", " << wij << std::endl;
// mean surface dipslacement calculation // mean surface dipslacement calculation
*Ac_offset = wij*Ac; *Ac_offset = wij*Ac;
@ -961,64 +861,17 @@ double GranSubModNormalMDR::calculate_forces()
const double eps_bar_contact = (1.0/(3*kappa*Velas[i]))*(fx*bx + fy*by + fz*bz); const double eps_bar_contact = (1.0/(3*kappa*Velas[i]))*(fx*bx + fy*by + fz*bz);
eps_bar[i] += eps_bar_contact; eps_bar[i] += eps_bar_contact;
//double **x = atom->x; double desp_bar_contact = eps_bar_contact - *eps_bar_offset;
//const double xi = x[i_true][0];
//const double xj = x[j_true][0];
//std::cout << i_true << ", " << j_true << ", " << xi << ", " << xj << ", " << gm->nx[0] << ", " << gm->nx[1] << ", " << gm->nx[2] << std::endl;
//if ( (i == 0 && j == 2 && gm->contact_type == 0) || (i == 2 && j == 0 && gm->contact_type == 0)) {
//std::cout << i << ", " << j << ", " << gm->contact_type << " || " << delta << ", " << *delta_offset << ", " << (uintptr_t)(delta_offset) << " || " << deltao << ", " << *deltao_offset << ", " << (uintptr_t)(deltao_offset) << " || " << delta_MDR << ", " << *delta_MDR_offset << ", " << (uintptr_t)(delta_MDR_offset) << " || " << *Yflag_offset << ", " << (uintptr_t)(Yflag_offset) << " || " << R << std::endl;
//std::cout << i << ", " << j << ", " << gm->contact_type << " || " << fx << ", " << fy << ", " << fz << " || " << bx << ", " << by << ", " << bz << ", " << Velas[i] << std::endl;
//std::cout << i << ", " << j << ", " << gm->contact_type << " || " << eps_bar_contact << ", " << *eps_bar_offset << ", " << (uintptr_t)(eps_bar_offset) << " || " << wij << ", " << ddeltao << ", " << deltao << ", " << delta << ", " << *delta_offset << " || " << Ro << ", " << R << std::endl;
//}
//if () {
// std::cout << j << ", " << -Vo*(eps_bar_contact - *eps_bar_offset) - wij*MY_PI*ddeltao*( 2.0*deltao*Ro - pow(deltao,2.0) + pow(R,2.0) - pow(Ro,2.0) ) << ", " << -Vo*(eps_bar_contact - *eps_bar_offset) << ", " << wij*MY_PI*ddeltao*( 2.0*deltao*Ro - pow(deltao,2.0) + pow(R,2.0) - pow(Ro,2.0) ) << std::endl;
//std::cout << i << ", " << j << ", " << gm->contact_type << " || " << eps_bar_contact << ", " << *eps_bar_offset << ", " << (uintptr_t)(eps_bar_offset) << " || " << wij << ", " << ddeltao << ", " << deltao << " || " << Ro << ", " << R << std::endl;
//}
double desp_bar_contact = eps_bar_contact - *eps_bar_offset; // && desp_bar_contact < 0.0
if(delta_MDR == deltamax_MDR && *Yflag_offset > 0.0 && F_MDR > 0.0){ if(delta_MDR == deltamax_MDR && *Yflag_offset > 0.0 && F_MDR > 0.0){
const double Vo = (4.0/3.0)*MY_PI*pow(Ro,3.0); const double Vo = (4.0/3.0)*MY_PI*pow(Ro,3.0);
dRnumerator[i] += -Vo*(eps_bar_contact - *eps_bar_offset) - wij*MY_PI*ddeltao*( 2.0*deltao*Ro - pow(deltao,2.0) + pow(R,2.0) - pow(Ro,2.0) ); dRnumerator[i] += -Vo*(eps_bar_contact - *eps_bar_offset) - wij*MY_PI*ddeltao*( 2.0*deltao*Ro - pow(deltao,2.0) + pow(R,2.0) - pow(Ro,2.0) );
dRdenominator[i] += wij*2.0*MY_PI*R*(deltao + R - Ro); dRdenominator[i] += wij*2.0*MY_PI*R*(deltao + R - Ro);
//if ( (atom->tag[i] == 9) ) {
// std::cout << "CT: " << gm->contact_type << ", " << PAIR << "i_tag: " << atom->tag[i] << ", j_tag: " << atom->tag[j] << ", deltae1D: " << deltae1D << ", R: " << R << ", Ro: " << Ro << ", F_MDR: " << F_MDR << ", F_BULK: " << F_BULK << ", wij: " << wij << ", deltao: " << deltao << ", ddeltao: " << ddeltao << ", desp_bar: " << eps_bar_contact - *eps_bar_offset << std::endl;
//}
} }
*eps_bar_offset = eps_bar_contact; *eps_bar_offset = eps_bar_contact;
sigmaxx[i] += (1.0/Velas[i])*(fx*bx); sigmaxx[i] += (1.0/Velas[i])*(fx*bx);
sigmayy[i] += (1.0/Velas[i])*(fy*by); sigmayy[i] += (1.0/Velas[i])*(fy*by);
sigmazz[i] += (1.0/Velas[i])*(fz*bz); sigmazz[i] += (1.0/Velas[i])*(fz*bz);
//std::cout << psi_b << ", " << psi[i] << ", " << A << ", " << B << ", " << pY << ", " << amax << " || " << deltao << ", " << delta << ", " << ddelta << ", " << *delta_offset << ", " << ddelta_bar[i] << " || " << delta_MDR << ", " << ddelta_MDR << ", " << *delta_MDR_offset << ", " << deltamax_MDR << " || " << delta_BULK << ", " << ddelta_BULK << ", " << *delta_BULK_offset << " || " << R << " || " << Ac << ", " << *Ac_offset << ", " << Acon0[i] << ", " << Acon1[i] << " || " << F_MDR << ", " << F_BULK << ", " << Vgeo[i] << std::endl;
//std::cout << gm->i << ", " << gm->j << ", " << gm->radi << ", " << gm->radj << " | " << delta << ", " << F_MDR << " | " << deltae1D << ", " << A << ", " << B << std::endl;
//if (atom->tag[i] == 1 && lmp->update->ntimestep == 45000) {
// double nx;
// double ny;
// double nz;
// if (i == j_true) {
// nx = gm->nx[0];
// ny = gm->nx[1];
// nz = gm->nx[2];
// } else {
// nx = -gm->nx[0];
// ny = -gm->nx[1];
// nz = -gm->nx[2];
// }
// double deltae = deltamax_MDR - *deltap_offset;
// CSVWriter csvWriter("/Users/willzunker/lammps_mdr_develop/sims/MPFEM/deformed_particle_shape_data.csv");
// std::stringstream rowDataStream;
// rowDataStream << std::scientific << std::setprecision(8); // Set the format and precision
// rowDataStream << nx << ", " << ny << ", " << nz << ", " << Ro << ", " << R << ", " << delta << ", " << deltae << ", " << A << ", " << B << ", " << a_na;
// std::string rowData = rowDataStream.str();
// csvWriter.writeRow(rowData);
//}
} }
gm->i = i_true; gm->i = i_true;
@ -1031,24 +884,13 @@ double GranSubModNormalMDR::calculate_forces()
const double wij = std::max(1.0-pij,0.0); const double wij = std::max(1.0-pij,0.0);
*penalty_offset = 0.0; *penalty_offset = 0.0;
//std::cout << gm->i << ", " << gm->j << ", " << xi << ", " << xj << std::endl;
// force magnifiers to prevent over penetration
double * deltao_offset = & history[deltao_offset_0];
//const double wallForceMagnifer = std::exp(10.0*(*deltao_offset)/Rinitial[gm->i] - 10.0) + 1.0;
const double wallForceMagnifer = 1.0;
// assign final force // assign final force
//(gm->contact_type != PAIR) ? F = wij*F0*wallForceMagnifer : F = wij*(F0 + F1)/2; // F = 2*wij*pow(1/F0 + 1/F1,-1);
if (gm->contact_type != PAIR) { if (gm->contact_type != PAIR) {
F = wij*F0*wallForceMagnifer; F = wij*F0;
} else { } else {
F = wij*(F0 + F1)/2.0; F = wij*(F0 + F1)/2.0;
} }
//std::cout << F << ", " << F0 << ", " << F1 << " | " << R0 << ", " << R1 << std::endl;
// calculate damping force // calculate damping force
if (F > 0.0) { if (F > 0.0) {
double Eeff; double Eeff;
@ -1065,53 +907,9 @@ double GranSubModNormalMDR::calculate_forces()
const double damp_prefactor = beta*sqrt(gm->meff*kn); const double damp_prefactor = beta*sqrt(gm->meff*kn);
const double F_DAMP = -damp_prefactor*(gm->vnnr); const double F_DAMP = -damp_prefactor*(gm->vnnr);
//std:: cout << gm->contact_type << ", " << Eeff << " , " << Reff << ", " << gm->radi << ", " << gm->radj << " || " << kn << ", " << beta << ", " << gm->meff << " || " << F_DAMP << ", " << F << std::endl;
F += wij*F_DAMP; F += wij*F_DAMP;
} }
//double **x = atom->x;
//const double xi = x[gm->i][0];
//const double xj = x[gm->j][0];
//const double del = 20.0 - abs(xi-xj);
//if (i_true == 146 && j_true == 152) {
// CSVWriter csvWriter("/Users/willzunker/lammps_mdr_develop/sims/avicelTableting/rigid_flat_output.csv");
// std::stringstream rowDataStream;
// rowDataStream << std::scientific << std::setprecision(6); // Set the format and precision
// rowDataStream << gm->delta << ", " << delta0 << ", " << delta1 << ", " << dde0 << ", " << dde1 << ", " << (dde0 + dde1) << ", " << F0old << ", " << F1old << ", " << a0 << ", " << a1 << ", " << h0 << ", " << h1 << ", " << k_BULK0 << ", " << k_BULK1 << ", " << h_BULK0 << ", " << h_BULK1;
// std::string rowData = rowDataStream.str();
// csvWriter.writeRow(rowData);
//}
//if (i_true == 0 && j_true == 1) {
// CSVWriter csvWriter("/Users/willzunker/lammps_mdr_develop/sims/twoParticleDifferingRadii/rigid_flat_output.csv");
// std::stringstream rowDataStream;
// rowDataStream << std::scientific << std::setprecision(6); // Set the format and precision
// rowDataStream << gm->delta << ", " << delta0 << ", " << delta1 << ", " << dde0 << ", " << dde1 << ", " << (dde0 + dde1) << ", " << F0old << ", " << F1old << ", " << a0 << ", " << a1 << ", " << h0 << ", " << h1 << ", " << k_BULK0 << ", " << k_BULK1 << ", " << h_BULK0 << ", " << h_BULK1 << ", " << R0 << ", " << R1;
// std::string rowData = rowDataStream.str();
// csvWriter.writeRow(rowData);
//}
//if (i_true == 0 && j_true == 1) {
// CSVWriter csvWriter("/Users/willzunker/lammps_mdr_develop/sims/twoParticleDifferingRadii/rigid_flat_output_fit.csv");
// std::stringstream rowDataStream;
// rowDataStream << std::scientific << std::setprecision(6); // Set the format and precision
// rowDataStream << gm->delta << ", " << delta0 << ", " << delta1 << ", " << delta01;
// std::string rowData = rowDataStream.str();
// csvWriter.writeRow(rowData);
//}
//if (gm->i == 0 && gm->j == 2) {
// CSVWriter csvWriter("/Users/willzunker/lammps/sims/compressionSleeve/pairContactsBotCen.csv");
// std::stringstream rowDataStream;
// rowDataStream << std::scientific << std::setprecision(4); // Set the format and precision
// rowDataStream << del << ", " << F;
// std::string rowData = rowDataStream.str();
// csvWriter.writeRow(rowData);
//}
//std:: cout << "The force F is: " << F << std::endl;
return F; return F;
} }
@ -1121,33 +919,3 @@ void GranSubModNormalMDR::set_fncrit()
{ {
Fncrit = fabs(F); Fncrit = fabs(F);
} }
//std::cout << sidata.i << ", " << sidata.j << ", " << R << ", " << deltan << ", " << deltao << ", " << dRsums_i[0] << ", " << dRsums_i[1] << ", " << numQuant << std::endl;
//std::cout << gm->i << ", " << gm->j << " | " << gm->nx[0] << ", " << gm->nx[1] << ", " << gm->nx[2] << std::endl;
//std::cout << "F is: " << F << std::endl;
//std::cout << "Ro from particle history is: " << Ro[gm->i] << std::endl;
//std::cout << "MDR contact model has been entered." << std::endl;
// std::cout << "F is: " << F << std::endl;
//std::cout << "gamma > 0.0: " << F_MDR << ", " << gm->i << ", " << gm->j << std::endl;
//std::cout << "deltae1D <= 0.0: " << F_MDR << ", " << gm->i << ", " << gm->j << std::endl;
//std::cout << "F_MDR should be > 0: " << F_MDR << ", " << gm->i << ", " << gm->j << std::endl;
//std::cout << gm->i << ", " << gm->j << " || " << delta << ", " << delta_MDR << ", " << deltamax_MDR << ", " << deltae1D << " || " << A << ", " << B << std::endl;
//std::cout << i_true << ", " << j_true << std::endl;
//std::cout << history_index << ", " << history[0] << ", " << history[1] << ", " << history[2] << std::endl;
// initialize all history variables
//double delta_offset;
//double deltao_offset;
//double delta_MDR_offset;
//double delta_BULK_offset;
//double deltamax_MDR_offset;
//double Yflag;
//double deltaY_offset;
//double Ac_offset;
//double aAdh_offset;
//double deltap_offset;
//double cA_offset;
//double eps_bar_offset;
//double wall_contact_flag_offset;

View File

@ -17,7 +17,6 @@
#include "gran_sub_mod_normal.h" #include "gran_sub_mod_normal.h"
#include "granular_model.h" #include "granular_model.h"
#include "math_extra.h" #include "math_extra.h"
#include <iostream>
#include <cmath> #include <cmath>
@ -82,8 +81,6 @@ void GranSubModRollingSDS::calculate_forces()
hist_temp[1] = gm->history[rhist1]; hist_temp[1] = gm->history[rhist1];
hist_temp[2] = gm->history[rhist2]; hist_temp[2] = gm->history[rhist2];
//std::cout << "Frcrit rolling is: " << Frcrit << std::endl;
if (gm->history_update) { if (gm->history_update) {
rolldotn = dot3(hist_temp, gm->nx); rolldotn = dot3(hist_temp, gm->nx);

View File

@ -243,7 +243,11 @@ void GranularModel::init()
// Must have valid normal, damping, and tangential models // Must have valid normal, damping, and tangential models
if (normal_model->name == "none") error->all(FLERR, "Must specify normal granular model"); if (normal_model->name == "none") error->all(FLERR, "Must specify normal granular model");
//if (damping_model->name == "none") error->all(FLERR, "Must specify damping granular model"); TURNED OFF FOR MDR if (normal_model->name == "mdr") {
if (damping_model->name != "none") error->all(FLERR, "Damping model must be set to 'none' for the MDR contact model. Specify a coefficient of restitution CoR < 1 if normal damping is desired.");
} else {
if (damping_model->name == "none") error->all(FLERR, "Must specify damping granular model");
}
if (tangential_model->name == "none") error->all(FLERR, "Must specify tangential granular model"); if (tangential_model->name == "none") error->all(FLERR, "Must specify tangential granular model");
// Twisting, rolling, and heat are optional // Twisting, rolling, and heat are optional

View File

@ -39,7 +39,6 @@
#include "gran_sub_mod_normal.h" #include "gran_sub_mod_normal.h"
#include <cstring> #include <cstring>
#include <iostream>
using namespace LAMMPS_NS; using namespace LAMMPS_NS;
using namespace Granular_NS; using namespace Granular_NS;
@ -490,28 +489,7 @@ void PairGranular::init_style()
if (!fix_history) error->all(FLERR,"Could not find pair fix neigh history ID"); if (!fix_history) error->all(FLERR,"Could not find pair fix neigh history ID");
} }
/*
// Example
//Store persistent per atom quantities
if (! fix_flag) {
int tmp1, tmp2;
id_fix = "BOND_BPM_PLASTIC_FIX_PROP_ATOM";
modify->add_fix(
fmt::format("{} all property/atom d_plastic d_plastic_temp d_viscous_temp d_plastic_heat d_viscous_heat ghost yes", id_fix));
index_plastic = atom->find_custom("plastic",tmp1,tmp2);
index_pq = atom->find_custom("plastic_heat",tmp1,tmp2);
index_pt = atom->find_custom("plastic_temp",tmp1,tmp2);
index_vq = atom->find_custom("viscous_heat",tmp1,tmp2);
index_vt = atom->find_custom("viscous_temp",tmp1,tmp2);
fix_flag = 1;
}
*/
if (model->normal_model->name == "mdr") { if (model->normal_model->name == "mdr") {
std::cout << "MDR history variables have been initialized" << std::endl;
// FOR MDR CONTACT MODEL
//Store persistent per atom quantities //Store persistent per atom quantities
if (! fix_flag) { if (! fix_flag) {
int tmp1, tmp2; int tmp1, tmp2;
@ -537,11 +515,7 @@ void PairGranular::init_style()
index_sigmayy = atom->find_custom("sigmayy",tmp1,tmp2); // yy-component of the stress tensor, not necessary for force calculation index_sigmayy = atom->find_custom("sigmayy",tmp1,tmp2); // yy-component of the stress tensor, not necessary for force calculation
index_sigmazz = atom->find_custom("sigmazz",tmp1,tmp2); // zz-component of the stress tensor, not necessary for force calculation index_sigmazz = atom->find_custom("sigmazz",tmp1,tmp2); // zz-component of the stress tensor, not necessary for force calculation
index_contacts = atom->find_custom("contacts",tmp1,tmp2); // total contacts on particle index_contacts = atom->find_custom("contacts",tmp1,tmp2); // total contacts on particle
index_adhesive_length = atom->find_custom("adhesive_length",tmp1,tmp2); // total contacts on particle index_adhesive_length = atom->find_custom("adhesive_length",tmp1,tmp2); // total length of adhesive contact on a particle
std::cout << "MDR history variables have been initialized 2" << ", " << index_Ro << std::endl;
//index_volSums = atom->find_custom("volSums",tmp1,tmp2);
// Initiate MDR radius update fix // Initiate MDR radius update fix
modify->add_fix("fix_mdr_radius_update all mdr/radius/update"); modify->add_fix("fix_mdr_radius_update all mdr/radius/update");

View File

@ -49,7 +49,6 @@ class PairGranular : public Pair {
size_t get_size_history() const; size_t get_size_history() const;
// granular models // granular models
// MOVED HERE FROM PRIVATE FOR MDR MODEL
class Granular_NS::GranularModel** models_list; class Granular_NS::GranularModel** models_list;
int **types_indices; int **types_indices;
int nmodels, maxmodels; int nmodels, maxmodels;

View File

@ -40,7 +40,6 @@
#include <cmath> #include <cmath>
#include <cstring> #include <cstring>
#include <iostream>
using namespace LAMMPS_NS; using namespace LAMMPS_NS;
using namespace FixConst; using namespace FixConst;
@ -55,7 +54,7 @@ enum { SHIFT_NO, SHIFT_YES, SHIFT_POSSIBLE };
static constexpr double EINERTIA = 0.2; // moment of inertia prefactor for ellipsoid static constexpr double EINERTIA = 0.2; // moment of inertia prefactor for ellipsoid
static constexpr int ATOMPERBIN = 100; static constexpr int ATOMPERBIN = 30;
static constexpr double BIG = 1.0e20; static constexpr double BIG = 1.0e20;
static constexpr int VBINSIZE = 5; static constexpr int VBINSIZE = 5;
static constexpr double TOLERANCE = 0.00001; static constexpr double TOLERANCE = 0.00001;
@ -1322,7 +1321,6 @@ void FixSRD::collisions_single()
#endif #endif
if (t_remain > dt) { if (t_remain > dt) {
print_collision(i, j, ibounce, t_remain, dt, xscoll, xbcoll, norm, type);
ninside++; ninside++;
if (insideflag == INSIDE_ERROR || insideflag == INSIDE_WARN) { if (insideflag == INSIDE_ERROR || insideflag == INSIDE_WARN) {
std::string mesg; std::string mesg;
@ -2605,17 +2603,14 @@ void FixSRD::parameterize()
for (int i = 0; i < nlocal; i++) for (int i = 0; i < nlocal; i++)
if (mask[i] & groupbit) { if (mask[i] & groupbit) {
if (rmass) { if (rmass) {
if (mass_srd == 0.0) { if (mass_srd == 0.0)
mass_srd = rmass[i]; mass_srd = rmass[i];
std::cout << "mass if #1: " << rmass[i] << std::endl; else if (rmass[i] != mass_srd)
std::cout << "srd radius is: " << radius[i] << std::endl;
} else if (rmass[i] != mass_srd)
flag = 1; flag = 1;
} else { } else {
if (mass_srd == 0.0) { if (mass_srd == 0.0)
mass_srd = mass[type[i]]; mass_srd = mass[type[i]];
std::cout << "mass if #2: " << mass[type[i]] << std::endl; else if (mass[type[i]] != mass_srd)
} else if (mass[type[i]] != mass_srd)
flag = 1; flag = 1;
} }
} }
@ -2717,7 +2712,6 @@ void FixSRD::parameterize()
if (dimension == 3) { if (dimension == 3) {
volsrd = (domain->xprd * domain->yprd * domain->zprd) - volbig; volsrd = (domain->xprd * domain->yprd * domain->zprd) - volbig;
density_srd = nsrd * mass_srd / (domain->xprd * domain->yprd * domain->zprd - volbig); density_srd = nsrd * mass_srd / (domain->xprd * domain->yprd * domain->zprd - volbig);
std::cout << nsrd << ", " << mass_srd << ", " << domain->xprd << ", " << domain->yprd << ", " << domain->zprd << ", " << volbig << std::endl;
} else { } else {
volsrd = (domain->xprd * domain->yprd) - volbig; volsrd = (domain->xprd * domain->yprd) - volbig;
density_srd = nsrd * mass_srd / (domain->xprd * domain->yprd - volbig); density_srd = nsrd * mass_srd / (domain->xprd * domain->yprd - volbig);
@ -2779,7 +2773,7 @@ void FixSRD::parameterize()
gridsrd, binsize3x, binsize3y, binsize3z); gridsrd, binsize3x, binsize3y, binsize3z);
mesg += fmt::format(" SRD per actual grid cell = {:.8}\n", srd_per_cell); mesg += fmt::format(" SRD per actual grid cell = {:.8}\n", srd_per_cell);
mesg += fmt::format(" SRD viscosity = {:.8}\n", viscosity); mesg += fmt::format(" SRD viscosity = {:.8}\n", viscosity);
mesg += fmt::format(" big/SRD mass density ratio = {:.8} | big density = {:.8}, small density = {:.8}\n", mdratio,density_big,density_srd); mesg += fmt::format(" big/SRD mass density ratio = {:.8}\n", mdratio);
utils::logmesg(lmp, mesg); utils::logmesg(lmp, mesg);
} }

View File

@ -1,25 +0,0 @@
#include <iostream>
#include <fstream>
#include <string>
class CSVWriter {
public:
CSVWriter(const std::string& filename) : filename_(filename) {}
void writeRow(const std::string& data) {
std::ofstream file;
// Use the append mode to add data to the end of the file if it exists
file.open(filename_, std::ios::out | std::ios::app);
if (!file.is_open()) {
std::cerr << "Failed to open file: " << filename_ << std::endl;
return;
}
file << data << std::endl;
file.close();
}
private:
std::string filename_;
};

View File

@ -1,4 +1,3 @@
// clang-format off
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://www.lammps.org/, Sandia National Laboratories https://www.lammps.org/, Sandia National Laboratories
@ -37,7 +36,6 @@
#include "update.h" #include "update.h"
#include "fix_wall_gran_region.h" #include "fix_wall_gran_region.h"
#include "comm.h" #include "comm.h"
#include <iostream>
#include <algorithm> #include <algorithm>
using namespace LAMMPS_NS; using namespace LAMMPS_NS;
@ -53,8 +51,6 @@ FixMDRmeanSurfDisp::FixMDRmeanSurfDisp(LAMMPS *lmp, int narg, char **arg) :
comm_forward = 1; // value needs to match number of values you communicate comm_forward = 1; // value needs to match number of values you communicate
} }
// FOR MDR
int FixMDRmeanSurfDisp::setmask() int FixMDRmeanSurfDisp::setmask()
{ {
int mask = 0; int mask = 0;
@ -79,7 +75,6 @@ int FixMDRmeanSurfDisp::pack_forward_comm(int n, int *list, double *buf, int /*p
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
int j = list[i]; int j = list[i];
buf[m++] = ddelta_bar[j]; buf[m++] = ddelta_bar[j];
//buf[m++] = Acon0[j];
} }
return m; return m;
} }
@ -90,7 +85,6 @@ void FixMDRmeanSurfDisp::unpack_forward_comm(int n, int first, double *buf)
int last = first + n; int last = first + n;
for (int i = first; i < last; i++) { for (int i = first; i < last; i++) {
ddelta_bar[i] = buf[m++]; ddelta_bar[i] = buf[m++];
//Acon0[i] = buf[m++];
} }
} }
@ -102,9 +96,6 @@ void FixMDRmeanSurfDisp::pre_force(int)
const int size_history = pair->get_size_history(); const int size_history = pair->get_size_history();
//std::cout << " " << std::endl;
//std::cout << "New Step" << std::endl;
{ {
int i,j,k,lv1,ii,jj,inum,jnum,itype,jtype,ktype; int i,j,k,lv1,ii,jj,inum,jnum,itype,jtype,ktype;
@ -114,10 +105,6 @@ void FixMDRmeanSurfDisp::pre_force(int)
bool touchflag = false; bool touchflag = false;
//class GranularModel* model;
//class GranularModel** models_list = pair->models_list;
//int ** types_indices = pair->types_indices;
double **x = atom->x; double **x = atom->x;
int *type = atom->type; int *type = atom->type;
double *radius = atom->radius; double *radius = atom->radius;
@ -186,8 +173,8 @@ void FixMDRmeanSurfDisp::pre_force(int)
history_ik = &allhistory[size_history * kk]; history_ik = &allhistory[size_history * kk];
double * pik = &history_ik[22]; // penalty for contact i and k double * pik = &history_ik[22]; // penalty for contact i and k
// we don't know if who owns the contact ahead of time, k might be in j's neigbor list or vice versa, so we need to manually search to figure out the owner // we don't know if who owns the contact ahead of time, k might be in j's neigbor list or vice versa,
// check if k is in the neighbor list of j // so we need to manually search to figure out the owner check if k is in the neighbor list of j
double * pjk = NULL; double * pjk = NULL;
int * const jklist = firstneigh[j]; int * const jklist = firstneigh[j];
const int jknum = numneigh[j]; const int jknum = numneigh[j];
@ -197,10 +184,6 @@ void FixMDRmeanSurfDisp::pre_force(int)
allhistory_j = firsthistory[j]; allhistory_j = firsthistory[j];
history_jk = &allhistory_j[size_history * jk]; history_jk = &allhistory_j[size_history * jk];
pjk = &history_jk[22]; // penalty for contact j and k pjk = &history_jk[22]; // penalty for contact j and k
//int rank = 0;
//MPI_Comm_rank(MPI_COMM_WORLD, &rank);
//std::cout << "Print 183 pjk: " << rank << ", " << pjk << std::endl;
//std::cout << "Print 183 pjk[0]: " << rank << ", " << pjk[0] << std::endl;
break; break;
} }
} }
@ -215,16 +198,11 @@ void FixMDRmeanSurfDisp::pre_force(int)
allhistory_k = firsthistory[k]; allhistory_k = firsthistory[k];
history_kj = &allhistory_k[size_history * kj]; history_kj = &allhistory_k[size_history * kj];
pjk = &history_kj[22]; // penalty for contact j and k pjk = &history_kj[22]; // penalty for contact j and k
//int rank = 0;
//MPI_Comm_rank(MPI_COMM_WORLD, &rank);
//std::cout << "Print 198 pjk: " << rank << ", " << pjk << std::endl;
//std::cout << "Print 198 pjk[0]: " << rank << ", " << pjk[0] << std::endl;
break; break;
} }
} }
} }
//std::cout << "Print: " << __LINE__ << std::endl;
std::vector<double> distances = {r_ij,r_ik,r_jk}; std::vector<double> distances = {r_ij,r_ik,r_jk};
auto maxElement = std::max_element(distances.begin(), distances.end()); auto maxElement = std::max_element(distances.begin(), distances.end());
double maxValue = *maxElement; double maxValue = *maxElement;
@ -256,9 +234,7 @@ void FixMDRmeanSurfDisp::pre_force(int)
const double eny_ik = dely_ik * rinv_ik; const double eny_ik = dely_ik * rinv_ik;
const double enz_ik = delz_ik * rinv_ik; const double enz_ik = delz_ik * rinv_ik;
const double alpha = std::acos(enx_ij*enx_ik + eny_ij*eny_ik + enz_ij*enz_ik); const double alpha = std::acos(enx_ij*enx_ik + eny_ij*eny_ik + enz_ij*enz_ik);
//std::cout << "Print: " << __LINE__ << std::endl;
pjk[0] += 1.0/( 1.0 + std::exp(-50.0*(alpha/MY_PI - 1.0/2.0)) ); pjk[0] += 1.0/( 1.0 + std::exp(-50.0*(alpha/MY_PI - 1.0/2.0)) );
//std::cout << "Print: " << __LINE__ << std::endl;
} }
} }
} }
@ -334,8 +310,6 @@ void FixMDRmeanSurfDisp::pre_force(int)
history = &allhistory[size_history * jj]; history = &allhistory[size_history * jj];
model->history = history; model->history = history;
//const double pij = history[22];
//const double wij = std::max(1.0-pij,0.0);
const double delta = model->radsum - sqrt(model->rsq); const double delta = model->radsum - sqrt(model->rsq);
const int delta_offset_0 = 0; // apparent overlap const int delta_offset_0 = 0; // apparent overlap
@ -365,18 +339,6 @@ void FixMDRmeanSurfDisp::pre_force(int)
i1 = i; i1 = i;
} }
int rank = 0;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int i_ghost;
int j_ghost;
(i >= atom->nlocal) ? i_ghost = 1 : i_ghost = 0;
(j >= atom->nlocal) ? j_ghost = 1 : j_ghost = 0;
if (i_ghost == 1) {
std::cout << "rank: " << rank << ", i: " << i << ", j: " << j << ", i is ghost? " << i_ghost << ", j is ghost? " << j_ghost << ", nlocal: " << atom->nlocal << ", itag: " << atom->tag[i] << ", jtag: " << atom->tag[j] << std::endl;
}
//int i0 = std::max(i,j);
//int i1 = std::min(i,j);
double R0 = radius[i0]; double R0 = radius[i0];
double R1 = radius[i1]; double R1 = radius[i1];
@ -407,32 +369,13 @@ void FixMDRmeanSurfDisp::pre_force(int)
if (Acon0[i0] != 0.0) { if (Acon0[i0] != 0.0) {
const double Ac_offset0 = history[Ac_offset_0]; const double Ac_offset0 = history[Ac_offset_0];
ddelta_bar[i0] += Ac_offset0/Acon0[i0]*ddel0; // Multiply by 0.5 since displacement is shared equally between deformable particles. ddelta_bar[i0] += Ac_offset0/Acon0[i0]*ddel0;
} }
if (Acon0[i1] != 0.0) { if (Acon0[i1] != 0.0) {
const double Ac_offset1 = history[Ac_offset_1]; const double Ac_offset1 = history[Ac_offset_1];
ddelta_bar[i1] += Ac_offset1/Acon0[i1]*ddel1; ddelta_bar[i1] += Ac_offset1/Acon0[i1]*ddel1;
} }
//int rank = 0;
//MPI_Comm_rank(MPI_COMM_WORLD, &rank);
//std::cout << "delta_bar calc: Step: " << lmp->update->ntimestep << ", itag: " << atom->tag[i] << ", jtag: " << atom->tag[j] << ", i: " << i << ", j: " << j << ", rank: " << rank << ", Ac_offset0: " << history[Ac_offset_0] << ", Ac_offset1: " << history[Ac_offset_1] << ", Acon[i0]: " << Acon0[i0] << ", Acon[i1]: " << Acon0[i1] << ", ddel0: " << ddel0 << ", ddel1: " << ddel1 << ", ddelta_bar[i0]: " << ddelta_bar[i0] << ", ddelta_bar[i1]: " << ddelta_bar[i1] << std::endl;
//if (Acon0[j] != 0.0) {
// const double delta_offset0 = history[0];
// const double ddelta = delta/2.0 - delta_offset0; // Divide by 2.0 since we are storing 1/2 deltan in main MDR script
// const double Ac_offset0 = history[18];
// ddelta_bar[j] += Ac_offset0/Acon0[j]*ddelta; // Multiply by 0.5 since displacement is shared equally between deformable particles.
//}
//
//if (Acon0[i] != 0.0) {
// const double delta_offset1 = history[1];
// const double ddelta = delta/2.0 - delta_offset1; // Divide by 2.0 since we are storing 1/2 deltan in main MDR script
// const double Ac_offset1 = history[19];
// ddelta_bar[i] += Ac_offset1/Acon0[i]*ddelta;
//}
} }
} }
} }
@ -515,27 +458,11 @@ void FixMDRmeanSurfDisp::pre_force(int)
const double delta_offset0 = fix->history_many[i][fix->c2r[ic]][0]; const double delta_offset0 = fix->history_many[i][fix->c2r[ic]][0];
const double ddelta = delta - delta_offset0; const double ddelta = delta - delta_offset0;
const double Ac_offset0 = fix->history_many[i][fix->c2r[ic]][18]; const double Ac_offset0 = fix->history_many[i][fix->c2r[ic]][18];
ddelta_bar[i] += wij*Ac_offset0/Acon0[i]*ddelta; // Multiply by 0.5 since displacement is shared equally between deformable particles. ddelta_bar[i] += wij*Ac_offset0/Acon0[i]*ddelta;
//std::cout << delta << ", " << delta_offset0 << " || " << Ac_offset0 << ", " << Acon0[i] << ", " << ddelta << ", " << ddelta_bar[i] << std::endl;
} }
} }
} }
} }
} }
comm->forward_comm(this); comm->forward_comm(this);
//and the function delcarations in the header:
//int pack_forward_comm(int, int *, double *, int, int *) override;
//void unpack_forward_comm(int, int, double *) override;
//Then the methods would look like::
//where comm_stage is a public flag to control hich quantity is being communicated
} }
//std::cout << radius[i] << ", " << dR << ", " << dRnumerator[i] << ", " << dRdenominator[i] << ", " << dRdenominator[i] - 4.0*MY_PI*pow(R,2.0) << std::endl;
//std::cout << "Fix radius update setup has been entered !!!" << std::endl;
//std::cout << Ro[0] << ", " << Vgeo[0] << ", " << Velas[0] << std::endl;

View File

@ -1,4 +1,3 @@
// clang-format off
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://www.lammps.org/, Sandia National Laboratories https://www.lammps.org/, Sandia National Laboratories
@ -28,14 +27,12 @@
#include "memory.h" #include "memory.h"
#include "modify.h" #include "modify.h"
#include "variable.h" #include "variable.h"
#include "csv_writer.h"
#include "granular_model.h" #include "granular_model.h"
#include "pair_granular.h" #include "pair_granular.h"
#include "pair.h" #include "pair.h"
#include "gran_sub_mod_normal.h" #include "gran_sub_mod_normal.h"
#include "update.h" #include "update.h"
#include "comm.h" #include "comm.h"
#include <iostream>
#include <iomanip> #include <iomanip>
#include <sstream> #include <sstream>
@ -52,8 +49,6 @@ FixMDRradiusUpdate::FixMDRradiusUpdate(LAMMPS *lmp, int narg, char **arg) :
comm_forward = 20; // value needs to match number of values you communicate comm_forward = 20; // value needs to match number of values you communicate
} }
// FOR MDR
int FixMDRradiusUpdate::setmask() int FixMDRradiusUpdate::setmask()
{ {
int mask = 0; int mask = 0;
@ -167,43 +162,10 @@ void FixMDRradiusUpdate::pre_force(int)
if (model->normal_model->name == "mdr") norm_model = dynamic_cast<GranSubModNormalMDR *>(model->normal_model); if (model->normal_model->name == "mdr") norm_model = dynamic_cast<GranSubModNormalMDR *>(model->normal_model);
} }
if (norm_model == nullptr) error->all(FLERR, "Did not find mdr model"); if (norm_model == nullptr) error->all(FLERR, "Did not find mdr model");
//model = models_list[0];
//class GranSubModNormalMDR* norm_model = dynamic_cast<GranSubModNormalMDR *>(model->normal_model);
//std::cout << "Preforce was called radius update" << std::endl;
// assign correct value to initially non-zero MDR particle history variables
//int tmp1, tmp2;
//int index_Ro = atom->find_custom("Ro",tmp1,tmp2);
//int index_Vgeo = atom->find_custom("Vgeo",tmp1,tmp2);
//int index_Velas = atom->find_custom("Velas",tmp1,tmp2);
//int index_Atot = atom->find_custom("Atot",tmp1,tmp2);
//int index_psi = atom->find_custom("psi",tmp1,tmp2);
//int index_psi_b = atom->find_custom("psi_b",tmp1,tmp2);
//int index_sigmaxx = atom->find_custom("sigmaxx",tmp1,tmp2);
//int index_sigmayy = atom->find_custom("sigmayy",tmp1,tmp2);
//int index_sigmazz = atom->find_custom("sigmazz",tmp1,tmp2);
//int index_history_setup_flag = atom->find_custom("history_setup_flag",tmp1,tmp2);
//int index_contacts = atom->find_custom("contacts",tmp1,tmp2);
//int index_adhesive_length = atom->find_custom("adhesive_length",tmp1,tmp2);
//double * Ro = atom->dvector[index_Ro];
//double * Vgeo = atom->dvector[index_Vgeo];
//double * Velas = atom->dvector[index_Velas];
//double * Atot = atom->dvector[index_Atot];
//double * psi = atom->dvector[index_psi];
//double * psi_b = atom->dvector[index_psi_b];
//double * sigmaxx = atom->dvector[index_sigmaxx];
//double * sigmayy = atom->dvector[index_sigmayy];
//double * sigmazz = atom->dvector[index_sigmazz];
//double * history_setup_flag = atom->dvector[index_history_setup_flag];
//double * contacts = atom->dvector[index_contacts];
//double * adhesive_length = atom->dvector[index_adhesive_length];
double *radius = atom->radius; double *radius = atom->radius;
int nlocal = atom->nlocal; int nlocal = atom->nlocal;
//std::cout << "ntotal " << ntotal << ", nlocal " << atom->nlocal << ", nghost " << atom->nghost << std::endl;
for (int i = 0; i < nlocal; i++) { for (int i = 0; i < nlocal; i++) {
if (history_setup_flag[i] < 1e-16) { if (history_setup_flag[i] < 1e-16) {
Ro[i] = radius[i]; Ro[i] = radius[i];
@ -220,9 +182,7 @@ void FixMDRradiusUpdate::pre_force(int)
contacts[i] = 0.0; contacts[i] = 0.0;
adhesive_length[i] = 0.0; adhesive_length[i] = 0.0;
} }
comm->forward_comm(this); comm->forward_comm(this);
} }
int FixMDRradiusUpdate::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/,int * /*pbc*/) int FixMDRradiusUpdate::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/,int * /*pbc*/)
@ -284,21 +244,9 @@ void FixMDRradiusUpdate::unpack_forward_comm(int n, int first, double *buf)
void FixMDRradiusUpdate::end_of_step() void FixMDRradiusUpdate::end_of_step()
{ {
//comm->forward_comm(this);
//std::cout << "end_of_step() was called radius update" << std::endl;
// update the apparent radius of every particle // update the apparent radius of every particle
double *radius = atom->radius; double *radius = atom->radius;
int nlocal = atom->nlocal; int nlocal = atom->nlocal;
double sigmaxx_sum = 0.0;
double sigmayy_sum = 0.0;
double sigmazz_sum = 0.0;
double Vparticles = 0.0;
//std::cout << "New step" << std::endl;
for (int i = 0; i < nlocal; i++) { for (int i = 0; i < nlocal; i++) {
@ -308,32 +256,15 @@ void FixMDRradiusUpdate::end_of_step()
const double Vo = 4.0/3.0*MY_PI*pow(Ro[i],3.0); const double Vo = 4.0/3.0*MY_PI*pow(Ro[i],3.0);
const double Vgeoi = 4.0/3.0*MY_PI*pow(R,3.0) - Vcaps[i]; const double Vgeoi = 4.0/3.0*MY_PI*pow(R,3.0) - Vcaps[i];
Vgeo[i] = std::min(Vgeoi,Vo); Vgeo[i] = std::min(Vgeoi,Vo);
//(Vgeoi < Vo) ? Vgeo[i] = Vgeoi : Vgeo[i] = Vo;
const double Afree = Atot[i] - Acon1[i]; const double Afree = Atot[i] - Acon1[i];
psi[i] = Afree/Atot[i]; psi[i] = Afree/Atot[i];
//if (psi[i] < 0.08) {
// std::cout << "psi is: " << psi[i] << std::endl;
//}
const double dR = std::max(dRnumerator[i]/(dRdenominator[i] - 4.0*MY_PI*pow(R,2.0)),0.0); const double dR = std::max(dRnumerator[i]/(dRdenominator[i] - 4.0*MY_PI*pow(R,2.0)),0.0);
if (psi_b[i] < psi[i]) { if (psi_b[i] < psi[i]) {
if ((radius[i] + dR) < (1.5*Ro[i])) radius[i] += dR; if ((radius[i] + dR) < (1.5*Ro[i])) radius[i] += dR;
//radius[i] += dR;
} }
//if (dR > 1e-7) {
// std::cout << "big dR change" << std::endl;
//}
//if (atom->tag[i] == 9){
// std::cout << i << ", radius: " << radius[i] << ", dR: " << dR << ", dRnum: " << dRnumerator[i] << ", dRdenom " << dRdenominator[i] << ", dRdem_full " << dRdenominator[i] - 4.0*MY_PI*pow(R,2.0) << std::endl;
//}
//std::cout << i << ", " << radius[i] << " | " << psi_b[i] << ", " << psi[i] << " | " << Acon1[i] << ", " << Atot[i] << std::endl;
Velas[i] = Vo*(1.0 + eps_bar[i]); Velas[i] = Vo*(1.0 + eps_bar[i]);
Vcaps[i] = 0.0; Vcaps[i] = 0.0;
eps_bar[i] = 0.0; eps_bar[i] = 0.0;
@ -341,46 +272,8 @@ void FixMDRradiusUpdate::end_of_step()
dRdenominator[i] = 0.0; dRdenominator[i] = 0.0;
Acon0[i] = Acon1[i]; Acon0[i] = Acon1[i];
Acon1[i] = 0.0; Acon1[i] = 0.0;
//std::cout << "Acon reset: " << Acon0[i] << ", " << Acon1[i] << std::endl;
Atot_sum[i] = 0.0; Atot_sum[i] = 0.0;
ddelta_bar[i] = 0.0; ddelta_bar[i] = 0.0;
//adhesive_length[i] = adhesive_length[i]/contacts[i]; // convert adhesive length to average aAdh for each particle
//if (lmp->update->ntimestep == 487500) {
// double **x = atom->x;
// CSVWriter csvWriter("/Users/willzunker/lammps_mdr_develop/sims/avicelTableting/atom_stresses_at_mid_compression.csv");
// std::stringstream rowDataStream;
// rowDataStream << std::scientific << std::setprecision(4); // Set the format and precision
// rowDataStream << sigmaxx[i] << ", " << sigmayy[i] << ", " << sigmazz[i] << ", " << Velas[i] << ", " << x[i][2];
// std::string rowData = rowDataStream.str();
// csvWriter.writeRow(rowData);
//}
//
//if (lmp->update->ntimestep == 595750) {
// double **x = atom->x;
// CSVWriter csvWriter("/Users/willzunker/lammps_mdr_develop/sims/avicelTableting/atom_stresses_at_max_compression.csv");
// std::stringstream rowDataStream;
// rowDataStream << std::scientific << std::setprecision(4); // Set the format and precision
// rowDataStream << sigmaxx[i] << ", " << sigmayy[i] << ", " << sigmazz[i] << ", " << Velas[i] << ", " << x[i][2];
// std::string rowData = rowDataStream.str();
// csvWriter.writeRow(rowData);
//}
//sigmaxx_sum += sigmaxx[i];
//sigmayy_sum += sigmayy[i];
//sigmazz_sum += sigmazz[i];
//Vparticles += Velas[i];
} }
//double sigmaxx_avg = sigmaxx_sum/nlocal;
//double sigmayy_avg = sigmayy_sum/nlocal;
//double sigmazz_avg = sigmazz_sum/nlocal;
comm->forward_comm(this); comm->forward_comm(this);
} }
//std::cout << radius[i] << ", " << dR << ", " << dRnumerator[i] << ", " << dRdenominator[i] << ", " << dRdenominator[i] - 4.0*MY_PI*pow(R,2.0) << std::endl;
//std::cout << "Fix radius update setup has been entered !!!" << std::endl;
//std::cout << Ro[0] << ", " << Vgeo[0] << ", " << Velas[0] << std::endl;