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; }