38 #include <boost/core/ignore_unused.hpp> 
   39 #include <boost/algorithm/string.hpp> 
   46 #include <boost/math/special_functions/spherical_harmonic.hpp> 
   54     RegisterCreatorFunction(
"MMFDiffusion",
 
   56                 "MMFDiffusion equation.");
 
   58     MMFDiffusion::MMFDiffusion(
 
   89       int shapedim = 
m_fields[0]->GetShapeDimension();
 
   91       for(
int j=0; j<shapedim; ++j)
 
  101       if(
m_session->DefinesSolverInfo(
"TESTTYPE"))
 
  103       std::string TestTypeStr = 
m_session->GetSolverInfo(
"TESTTYPE");
 
  119         if(
m_session->DefinesSolverInfo(
"INITWAVETYPE"))
 
  121             std::string InitWaveTypeStr = 
m_session->GetSolverInfo(
"INITWAVETYPE");
 
  155     for (
int k=0; k<MFdim; ++k)
 
  212         int nvariables  = inarray.size();
 
  223         for (
int n = 1; n < nvariables; ++n)
 
  235         for (
int i = 0; i < nvariables; ++i)
 
  282         for(
int k=0; k<nq; k++)
 
  298         for(
int k=0; k<nq; k++)
 
  321       Vmath::Svtvp(nq,m_a,&inarray[0][0],1,&temp[0],1,&temp[0],1);
 
  322       Vmath::Svtvp(nq,m_b,&inarray[1][0],1,&temp[0],1,&outarray[0][0],1);
 
  325       Vmath::Svtvp(nq,m_c,&inarray[0][0],1,&temp[0],1,&temp[0],1);
 
  326       Vmath::Svtvp(nq,m_d,&inarray[1][0],1,&temp[0],1,&outarray[1][0],1);
 
  339         Vmath::Vmul(nq,&inarray[0][0],1,&inarray[0][0],1,&cube[0],1);
 
  340         Vmath::Vmul(nq,&inarray[1][0],1,&cube[0],1,&cube[0],1);
 
  345         Vmath::Svtvp(nq,coeff,&inarray[0][0],1,&cube[0],1,&tmp[0],1);
 
  346         Vmath::Vadd(nq,&Aonevec[0],1,&tmp[0],1,&outarray[0][0],1);
 
  349         Vmath::Svtvm(nq,B,&inarray[0][0],1,&cube[0],1,&outarray[1][0],1);
 
  366       Vmath::Smul(nq, -1.0*c1, inarray[0], 1, outarray[0], 1);
 
  368       Vmath::Vmul(nq, tmp, 1, inarray[0], 1, outarray[0], 1);
 
  370       Vmath::Vmul(nq, tmp, 1, outarray[0], 1, outarray[0], 1);
 
  373       Vmath::Vadd(nq, tmp, 1, outarray[0], 1, outarray[0], 1);
 
  377       Vmath::Svtvp(nq, -1.0*d, inarray[1], 1, inarray[0], 1, outarray[1], 1);
 
  378       Vmath::Smul(nq, b, outarray[1], 1, outarray[1], 1);
 
  393       Vmath::Smul(nq, -1.0*c1, inarray[0], 1, outarray[0], 1);
 
  395       Vmath::Vmul(nq, tmp, 1, outarray[0], 1, outarray[0], 1);
 
  397       Vmath::Vmul(nq, tmp, 1, outarray[0], 1, outarray[0], 1);
 
  399       Vmath::Vmul(nq, inarray[0], 1, inarray[1], 1, tmp, 1);
 
  401       Vmath::Vadd(nq, tmp, 1, outarray[0], 1, outarray[0], 1);
 
  404       Vmath::Svtvp(nq, -1.0*d, inarray[1], 1, inarray[0], 1, outarray[1], 1);
 
  405       Vmath::Smul(nq, b, outarray[1], 1, outarray[1], 1);
 
  422       Vmath::Smul(nq, -1.0*c1, inarray[0], 1, outarray[0], 1);
 
  424       Vmath::Vmul(nq, tmp, 1, outarray[0], 1, outarray[0], 1);
 
  426       Vmath::Vmul(nq, tmp, 1, outarray[0], 1, outarray[0], 1);
 
  428       Vmath::Vmul(nq, inarray[0], 1, inarray[1], 1, tmp, 1);
 
  430       Vmath::Vadd(nq, tmp, 1, outarray[0], 1, outarray[0], 1);
 
  434       Vmath::Smul(nq, mu1, inarray[1], 1, outarray[1], 1);
 
  436       Vmath::Vdiv(nq, outarray[1], 1, tmp, 1, outarray[1], 1);
 
  437       Vmath::Sadd(nq, c0, outarray[1], 1, outarray[1], 1);
 
  445       Vmath::Vmul(nq, tmp, 1, outarray[1], 1, outarray[1], 1);
 
  459                         bool dumpInitialConditions,
 
  462         boost::ignore_unused(domain);
 
  527       for(
int i = 0; i < 
m_fields.size(); ++i)
 
  533         if(dumpInitialConditions)
 
  554     for (
int k=0; k<nq; k++)
 
  574     for (
int k=0; k<nq; k++)
 
  591         std::complex<double> Spericharmonic, delta_n, temp;
 
  592     std::complex<double> varphi0, varphi1;
 
  593         std::complex<double> B_mn, D_mn;
 
  615         for (i = 0; i < Maxn; ++i)
 
  621         Ainit[5][0] = -0.5839;
 
  622         Ainit[5][1] = -0.8436;
 
  623         Ainit[5][2] = -0.4764;
 
  624         Ainit[5][3] = 0.6475;
 
  625         Ainit[5][4] = 0.1886;
 
  626         Ainit[5][5] = 0.8709;
 
  627         Ainit[5][6] = -0.8338;
 
  628         Ainit[5][7] = 0.1795;
 
  629         Ainit[5][8] = -0.7873;
 
  630         Ainit[5][9] = 0.8842;
 
  631         Ainit[5][10] = 0.2943;
 
  633         Binit[5][0] = -0.6263;
 
  634         Binit[5][1] = 0.9803;
 
  635         Binit[5][2] = 0.7222;
 
  636         Binit[5][3] = 0.5945;
 
  637         Binit[5][4] = 0.6026;
 
  638         Binit[5][5] = -0.2076;
 
  639         Binit[5][6] = 0.4556;
 
  640         Binit[5][7] = 0.6024;
 
  641         Binit[5][8] = 0.9695;
 
  642         Binit[5][9] = -0.4936;
 
  643         Binit[5][10] = 0.1098;
 
  652         for (
int i = 0; i < nq; ++i)
 
  654       radius = 
sqrt(x[i]*x[i] + y[i]*y[i] + z[i]*z[i]) ;
 
  657       theta = asin( z[i]/radius ) + 0.5*
m_pi;
 
  660       phi = atan2( y[i], x[i] ) + 
m_pi;
 
  662       varphi0 = 0.0*varphi0;
 
  663       varphi1 = 0.0*varphi1;
 
  664       for (n = 0; n < Maxn; ++n)
 
  667           a_n = m_a - 
m_mu*( n*(n+1)/radius/radius );
 
  668           d_n = m_d - m_nu*( n*(n+1)/radius/radius );
 
  670           gamma_n = 0.5*( a_n + d_n );
 
  672           temp = ( a_n + d_n )*( a_n + d_n ) - 4.0*( a_n*d_n - m_b*m_c );
 
  673           delta_n = 0.5*
sqrt( temp );
 
  675           for (m = -n; m <=n; ++m)
 
  678           A_mn = Ainit[n][ind];
 
  679           C_mn = Binit[n][ind];
 
  681           B_mn = ( (a_n - gamma_n)*Ainit[n][ind] + m_b*Binit[n][ind])/delta_n;
 
  682           D_mn = ( m_c*Ainit[n][ind] + (d_n - gamma_n)*Binit[n][ind])/delta_n;
 
  684           Spericharmonic = boost::math::spherical_harmonic(n, m, theta, phi);
 
  685           varphi0 += exp(gamma_n*time)*(A_mn*cosh(delta_n*time) + B_mn*sinh(delta_n*time))*Spericharmonic;
 
  686           varphi1 += exp(gamma_n*time)*(C_mn*cosh(delta_n*time) + D_mn*sinh(delta_n*time))*Spericharmonic;
 
  690       u[i] = varphi0.real();
 
  691       v[i] = varphi1.real();
 
  729     for (
int i=0; i<nq; i++)
 
  739           outarray[i] = 1.0/( 1.0 + exp( ( xp - radiusofinit)/frontstiff ) );
 
  751           outarray[i] = 1.0/( 1.0 + exp( ( 
sqrt(xp*xp) - radiusofinit)/frontstiff ) ) + 1.0/( 1.0 + exp( ( 
sqrt(xp2*xp2) - radiusofinit)/frontstiff ) );
 
  763           outarray[i] =1.0/( 1.0 + exp( ( xp - radiusofinit)/frontstiff ) );
 
  775           outarray[i] = 1.0/( 1.0 + exp( ( 
sqrt(xp*xp+yp*yp)/bs - radiusofinit)/frontstiff ) );
 
  788           rad = 
sqrt(xloc*xloc + yloc*yloc + zloc*zloc);
 
  790           xloc = xloc/radiusofinit;
 
  791           yloc = yloc/radiusofinit;
 
  792           zloc = zloc/radiusofinit;
 
  796           outarray[i] = exp( -(1.0/2.0)*( xloc*xloc + yloc*yloc + zloc*zloc) ) ;
 
  812           outarray[i] = (1.0/(1.0+exp(2.0*yp)))*(1.0/(1.0+exp(-2.0*xp)))*( 1.0/( 1.0 + exp( ( xp - radiusofinit)/frontstiff ) ) );
 
  880 int main(
int argc, 
char *argv[])
 
  884     std::string vDriverModule;
 
  890         session = LibUtilities::SessionReader::CreateInstance(argc, argv);
 
  893         graph = SpatialDomains::MeshGraph::Read(session);
 
  896         session->LoadSolverInfo(
"Driver", vDriverModule, 
"Standard");
 
  905     catch (
const std::runtime_error& e)
 
  909     catch (
const std::string& eStr)
 
  911         std::cout << 
"Error: " << eStr << std::endl;
 
int main(int argc, char *argv[])
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
void DefineOdeRhs(FuncPointerT func, ObjectPointerT obj)
void DefineImplicitSolve(FuncPointerT func, ObjectPointerT obj)
StdRegions::VarCoeffMap m_varcoeff
Variable diffusivity.
virtual ~MMFDiffusion()
Desctructor.
void Morphogenesis(const NekDouble time, unsigned int field, Array< OneD, NekDouble > &outfield)
InitWaveType m_InitWaveType
Array< OneD, NekDouble > m_epsu
void TestCubeProblem(const NekDouble time, Array< OneD, NekDouble > &outfield)
virtual void v_InitObject()
Init object for UnsteadySystem class.
Array< OneD, NekDouble > m_epsilon
void DoOdeRhs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
Computes the reaction terms  and .
virtual void v_GenerateSummary(SolverUtils::SummaryList &s)
Prints a summary of the model parameters.
Array< OneD, NekDouble > PlanePhiWave()
void DoImplicitSolve(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, NekDouble time, NekDouble lambda)
Solve for the diffusion term.
void TestPlaneProblem(const NekDouble time, Array< OneD, NekDouble > &outfield)
virtual void v_EvaluateExactSolution(unsigned int field, Array< OneD, NekDouble > &outfield, const NekDouble time)
virtual void v_SetInitialConditions(NekDouble initialtime, bool dumpInitialConditions, const int domain)
Sets a custom initial condition.
int m_spacedim
Spatial dimension (>= expansion dim).
virtual SOLVER_UTILS_EXPORT void v_SetInitialConditions(NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0)
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
virtual SOLVER_UTILS_EXPORT void v_EvaluateExactSolution(unsigned int field, Array< OneD, NekDouble > &outfield, const NekDouble time)
SOLVER_UTILS_EXPORT void WriteFld(const std::string &outname)
Write field data to the given filename.
std::string m_sessionName
Name of the session.
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
SOLVER_UTILS_EXPORT void SetBoundaryConditions(NekDouble time)
Evaluates the boundary conditions at the given time.
SOLVER_UTILS_EXPORT int GetTotPoints()
A base class for PDEs which include an advection component.
Array< OneD, Array< OneD, NekDouble > > m_DivMF
Array< OneD, Array< OneD, NekDouble > > m_movingframes
SOLVER_UTILS_EXPORT void MMFInitObject(const Array< OneD, const Array< OneD, NekDouble >> &Anisotropy, const int TangentXelem=-1)
virtual SOLVER_UTILS_EXPORT void v_GenerateSummary(SummaryList &s)
Print a summary of time stepping parameters.
Base class for unsteady solvers.
LibUtilities::TimeIntegrationSchemeOperators m_ode
The time integration scheme operators to use.
bool m_explicitDiffusion
Indicates if explicit or implicit treatment of diffusion is used.
virtual SOLVER_UTILS_EXPORT void v_InitObject()
Init object for UnsteadySystem class.
static NekDouble rad(NekDouble x, NekDouble y)
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< Driver > DriverSharedPtr
A shared pointer to a Driver object.
std::vector< std::pair< std::string, std::string > > SummaryList
DriverFactory & GetDriverFactory()
EquationSystemFactory & GetEquationSystemFactory()
void AddSummaryItem(SummaryList &l, const std::string &name, const std::string &value)
Adds a summary item to the summary info list.
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::map< ConstFactorType, NekDouble > ConstFactorMap
The above copyright notice and this permission notice shall be included.
const char *const InitWaveTypeMap[]
@ SIZE_TestType
Length of enum list.
const char *const TestTypeMap[]
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
void Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
svtvp (scalar times vector plus vector): z = alpha*x + y
void Neg(int n, T *x, const int incx)
Negate x = -x.
T Vmin(int n, const T *x, const int incx)
Return the minimum element in x - called vmin to avoid conflict with min.
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
void Svtvm(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
svtvp (scalar times vector plus vector): z = alpha*x - y
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Vdiv(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x/y.
void Zero(int n, T *x, const int incx)
Zero vector.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
void Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add vector y = alpha - x.
T Vmax(int n, const T *x, const int incx)
Return the maximum element in x – called vmax to avoid conflict with max.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
scalarT< T > sqrt(scalarT< T > in)