/*
 $Id: dirichlettr.cc,v 1.2 1996/10/04 15:06:30 roitzsch Exp $
 (C)opyright 1996 by Konrad-Zuse-Center, Berlin
 All rights reserved.
 Part of the Kaskade distribution
*/

#include "dirichlettr.h"

#include "physics.h"

#include "utils.h"
#include "numerics.h"

#include "cmdpars.h"
extern CmdPars Cmd;

//-------------------------------------------------------------------------
ConstTransDirichlet:: ConstTransDirichlet(char* fileName)
                    : ConstDirichletBCs(fileName)
{ 
}

Real ConstTransDirichlet:: initialValue(Vector<Real>& /*x*/, Real /*time*/, int /*comp*/) const
{
    return 0.0;
}
//-------------------------------------------------------------------------

//-------------------------------------------------------------------------

UserTransDirichlet:: UserTransDirichlet()
{ 
}

//-------------------------------------------------------------------------

StepDirichlet:: StepDirichlet()
{ 
    xStep = 0.5;   	Cmd.get("xStep", &xStep);
}
//-------------------------------------------------------------------------

void StepDirichlet:: setBC(int node, int id, Vector<Real>& x, int /*comp*/, 
			   Real /*time*/)
{
    Id[node] = id;
    Values[node] = value(x);
}
//-------------------------------------------------------------------------
 
Real StepDirichlet:: value(Vector<Real>& x) const
{
    if (x[1] <= xStep) return 1.0;
    else  return 0.0;
}
//-------------------------------------------------------------------------

Real StepDirichlet:: initialValue(Vector<Real>& x, Real /*time*/, int /*comp*/) const
{
    return value(x);
}
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------

void JumpDirichlet:: setBC(int node, int id, Vector<Real>& x, int /*comp*/, 
			   Real /*time*/)
{
    Id[node] = id;
    Values[node] = value(x);
}
//-------------------------------------------------------------------------

Real JumpDirichlet:: value(Vector<Real>& /*x*/) const { return 0.0; }

//-------------------------------------------------------------------------

Real JumpDirichlet:: initialValue(Vector<Real>& x, Real /*time*/, int /*comp*/) const
{
    if (x[1] <= xStep) return -1.0;
    else  return 1.0;
}
//-------------------------------------------------------------------------

Real TransDirichlet:: value(Vector<Real>& x) const
{
    Real val=1.0, p=100.0, x0=0.5, xm;
    int i;

    FORALL(x,i)
    {
    	xm = x[i] - x0;
    	val *= x[i]*(x[i]-1.0)*exp(-p*xm*xm);
    }

    return val;
}

void TransDirichlet:: setBC(int node, int id, Vector<Real>& x, int /*comp*/, 
			    Real /*time*/)
{
    Id[node] = id;
    Values[node] = value(x);
}
//-------------------------------------------------------------------------
Real TransDirichlet:: initialValue(Vector<Real>& x, Real /*time*/, int /*comp*/) const
{
    return value(x);
}
//-------------------------------------------------------------------------

//-------------------------------------------------------------------------
//-------------------------------------------------------------------------

StefanDirichletBCs:: StefanDirichletBCs() : VarDirichletBCs()
{ 
    kappa0 = 1.0;     	Cmd.get("kappa0", &kappa0);
    kappa1 = 1.0;     	Cmd.get("kappa1", &kappa1);

    c0 = 1.0;     	Cmd.get("c0", &c0);
    c1 = 1.0;     	Cmd.get("c1", &c1);

    theta1 = 0.0;     	Cmd.get("StefanTheta1", &theta1);
}
//-------------------------------------------------------------------------

void StefanDirichletBCs:: setBC(int node, int id, Vector<Real>& x, int /*comp*/, 
				Real time)
{
    Id[node] = id;
    Values[node] = value(x, time);
}
//-------------------------------------------------------------------------

Real StefanDirichletBCs:: initialValue(Vector<Real>& x, Real t, int /*comp*/) const
{
    return value(x,t);
}
//-------------------------------------------------------------------------

Real StefanDirichletBCs:: value(Vector<Real>& x, Real t) const
{
    Real theta = sqr(x[1]-0.5) + sqr(x[2]-0.5) - exp(-4.*t)/4.;

    if (theta > theta1) theta *= kappa1;
    else		theta *= kappa0;

    return theta;
}
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------


CastingDirichletBCs:: CastingDirichletBCs() : VarDirichletBCs()
{ 
    kappa0 = 1.0;     	Cmd.get("kappa0", &kappa0);
    kappa1 = 1.0;     	Cmd.get("kappa1", &kappa1);

    c0 = 1.0;     	Cmd.get("c0", &c0);
    c1 = 1.0;     	Cmd.get("c1", &c1);

    theta1 = 0.0;     	Cmd.get("StefanTheta1", &theta1);
}
//-------------------------------------------------------------------------

void CastingDirichletBCs:: setBC(int node, int id, Vector<Real>& x, int /*comp*/, 
				Real time)
{
    Id[node] = id;
    Values[node] = value(x, time);
}
//-------------------------------------------------------------------------

Real CastingDirichletBCs:: initialValue(Vector<Real>& /*x*/, Real /*t*/, int /*comp*/) const
{
    return 0.0000001;
    // return 0.0;
}
//-------------------------------------------------------------------------

Real CastingDirichletBCs:: value(Vector<Real>& /*x*/, Real /*t*/) const
{
    
    return -0.3;
}
//-------------------------------------------------------------------------

//-------------------------------------------------------------------------

PorousMediaDirichletBCs:: PorousMediaDirichletBCs() : VarDirichletBCs() { }

//-------------------------------------------------------------------------

void PorousMediaDirichletBCs:: setBC(int node, int id, Vector<Real>& /*x*/, 
				     int /*comp*/, Real /*time*/)
{
    Id[node] = id;
    Values[node] = 0.0;
}
//-------------------------------------------------------------------------


Real PorousMediaDirichletBCs:: initialValue(Vector<Real>& x, Real /*t*/, int /*comp*/)
									  const 
{
    Real r=0.0, phi=0.0, val=0.0;

    r = x[1]*x[1]+x[2]*x[2];
    
    if (x[1] == 0.0) phi = 4.*atan(1.)/2.;
    else             phi = atan(x[2]/x[1]);
    
    val = 0.4 - r*(1.+0.5*sin(14*phi));

    if (val < 0.0) val = 0.0;
    return val;
}




syntax highlighted by Code2HTML, v. 0.9.1