FLOW example#

Description#

This is a model implementing a two term norton flow law.

Code Listing#

// ------------------------------------------------------------
//   CLASS DOUBLE_NORTON_FLOW... double power law vdot = <f/K>^n + <f/K2>^n2
// ------------------------------------------------------------
class DOUBLE_NORTON_FLOW : public FLOW {
   double  _os; // old overstress
protected:
   COEFF   K, K2, n, n2;
public:
           DOUBLE_NORTON_FLOW();
   virtual void initialize(ASCII_FILE& file, MATERIAL_PIECE*);
           DOUBLE_NORTON_FLOW(const DOUBLE_NORTON_FLOW& in, MATERIAL_PIECE*);
   virtual MATERIAL_PIECE* copy_self(MATERIAL_PIECE*);

   double  flow_rate(double v, double stress);
   double  dflow_dv();
   double  dflow_dcrit();
   DERIVED;
};

DERIVED_IMPLEMENT1(DOUBLE_NORTON_FLOW,FLOW)
DECLARE_OBJECT(FLOW,DOUBLE_NORTON_FLOW,double_norton)

DOUBLE_NORTON_FLOW::DOUBLE_NORTON_FLOW() {}

void DOUBLE_NORTON_FLOW::initialize(ASCII_FILE& file, MATERIAL_PIECE* mp)
{ FLOW::initialize(file,mp);
  STRING err = "Double Norton flow";
  for(;;) {
    STRING str=file.getSTRING();
    if(!strn_cmp(str,"*",1)) break;
    else if(str=="K" )      K.read(str,file,mp);
    else if(str=="n" )      n.read(str,file,mp);
    else if(str=="K2" )     K2.read(str,file,mp);
    else if(str=="n2" )     n2.read(str,file,mp);
    else INPUT_ERROR("Unknown coefficient:"+str);
  } file.back();
}

DOUBLE_NORTON_FLOW::DOUBLE_NORTON_FLOW(const DOUBLE_NORTON_FLOW& in,
                                       MATERIAL_PIECE* boss) :
   FLOW(in, boss),
   K(in.K, boss), K2(in.K2, boss),
   n(in.n, boss), n2(in.n2, boss)
{
}

MATERIAL_PIECE* DOUBLE_NORTON_FLOW::copy_self(MATERIAL_PIECE* mp)
{ MATERIAL_PIECE* ret = new DOUBLE_NORTON_FLOW(*this, mp);
  return ret;
}

double DOUBLE_NORTON_FLOW::flow_rate(double, double stress)
{  _os=stress;
   return pow(stress/K(),n) + pow(stress/K2(),n2);
}

double  DOUBLE_NORTON_FLOW::dflow_dcrit()
{  return (n()*pow(_os/K(),n) + n2()*pow(_os/K2(),n2))/_os;
}

double DOUBLE_NORTON_FLOW::dflow_dv() { return 0.0; }