#include <utilities/aslParametersManager.h>
#include <math/aslTemplates.h>
#include <aslGeomInc.h>
#include <math/aslPositionFunction.h>
#include <aslDataInc.h>
#include <acl/aclGenerators.h>
#include <acl/aclMath/aclVectorOfElements.h>
#include <writers/aslVTKFormatWriters.h>
#include <num/aslLBGK.h>
#include <num/aslLBGKBC.h>
#include <num/aslBasicBC.h>
#include <num/aslCrystalGrowthBC.h>
#include <num/aslFDAdvectionDiffusion.h>
#include <utilities/aslTimer.h>
{
double rBath(1.);
}
{
double rDisk(.9);
double hDisk(0.1);
double rAxis(0.05);
double hAxis(.5);
double wPillar(.2);
double dPillar(.1);
vector<asl::AVec<>> pillar1{
makeAVec(wPillar*.5, dPillar*.5,0.),
vector<asl::AVec<>> pillar2{
makeAVec(dPillar*.5, wPillar*.5,0.),
vector<asl::AVec<>> pillarC{
makeAVec(center[0]+rDisk-dPillar*.5, center[1], 0.),
makeAVec(center[0]-rDisk+dPillar*.5, center[1], 0.),
makeAVec(center[0], center[1]+rDisk-dPillar*.5,0.),
makeAVec(center[0], center[1]-rDisk+dPillar*.5,0.)};
vector<vector<asl::AVec<>>> pillarsPoints(4);
for(unsigned int i(0); i<4; ++i)
pillarsPoints[i].resize(4);
for(unsigned int i(0); i<4; ++i)
{
pillarsPoints[0][i] = pillar2[i] + pillarC[0];
pillarsPoints[1][i] = pillar2[i] + pillarC[1];
pillarsPoints[2][i] = pillar1[i] + pillarC[2];
pillarsPoints[3][i] = pillar1[i] + pillarC[3];
}
makeAVec(center[0], center[1], .5*hDisk)));
makeAVec(center[0], center[1], -.5*hDisk - hAxis + dx*size[2])));
makeAVec(center[0], center[1], - .5*hAxis - hDisk*.25 + dx*size[2])));
auto dfPillars((dfPillar1 | dfPillar2 | dfPillar3 | dfPillar4) &
return normalize(diskBottom | diskTop | axis | dfPillars, dx);
}
{
double aCrystal(.5);
double hCrystalBase(.5);
double hCrystalPyramid(.5);
double hDisk(0.1);
center+
makeAVec(-aCrystal, aCrystal,0.),
center+
makeAVec(-aCrystal, -aCrystal,0.),
center+
makeAVec( aCrystal, -aCrystal,0.)}) &
auto cCrPyrBase(
makeAVec(center[0],center[1],hDisk+hCrystalBase-.01));
cCrPyrBase+
makeAVec(-aCrystal, aCrystal,0.),
cCrPyrBase+
makeAVec(-aCrystal, -aCrystal,0.),
cCrPyrBase+
makeAVec( aCrystal, -aCrystal,0.)},
cCrPyrBase+
makeAVec(0.,0.,hCrystalPyramid)));
}
{
double tPeriod(128);
double wMax(6.*3.14*2./60.);
double tPlato(tPeriod * .25);
double tAcceleration(tPeriod * .1);
double tStop(tPeriod * .05);
double intPart;
double tRel(modf(t/tPeriod, &intPart));
double x(0);
if(tRel<=tAcceleration)
x = tRel / tAcceleration;
if(tRel>tAcceleration && tRel<=tAcceleration+tPlato)
x = 1.;
if(tRel>tAcceleration+tPlato && tRel<=2.*tAcceleration+tPlato)
x = (2.*tAcceleration + tPlato - tRel) / tAcceleration;
if(tRel>2.*tAcceleration+tPlato && tRel<=2.*tAcceleration+tPlato+tStop)
x = 0;
if(tRel>2.*tAcceleration+tPlato+tStop && tRel<=3.*tAcceleration+tPlato+tStop)
x = -(tRel-2.*tAcceleration-tPlato-tStop) / tAcceleration;
if(tRel>3.*tAcceleration+tPlato+tStop && tRel<=3.*tAcceleration+2.*tPlato+tStop)
x = -1.;
if(tRel>3.*tAcceleration+2.*tPlato+tStop && tRel<=4.*tAcceleration+2.*tPlato+tStop)
x = -(4.*tAcceleration+2.*tPlato+tStop-tRel)/tAcceleration;
if(tRel>4.*tAcceleration+2.*tPlato+tStop)
x = 0;
return wMax*x;
}
int main(
int argc,
char* argv[])
{
"1.0");
appParamsManager.
load(argc, argv);
Param difCNum(difC.
v()*dt.
v()/dx.
v()/dx.
v());
std::cout << "Data initialization...";
auto bathMap(asl::generateDataContainerACL_SP<FlT>(block, 1, 1u));
auto platformCrysMap(asl::generateDataContainerACL_SP<FlT>(block, 1, 1u));
auto bathPlatformMap(asl::generateDataContainerACL_SP<FlT>(block, 1, 1u));
auto bathPlatformCrystalMap(asl::generateDataContainerACL_SP<FlT>(block, 1, 1u));
auto crystalMap(asl::generateDataContainerACL_SP<FlT>(block, 1, 1u));
auto cField(asl::generateDataContainerACL_SP<FlT>(block, 1, 1u));
std::cout << "Finished" << endl;
std::cout << "Numerics initialization...";
templ));
lbgk->init();
difCNum.v(),
lbgk->getVelocity(),
templ,
true));
nmDif->init();
std::vector<asl::SPNumMethod> bc;
std::vector<asl::SPNumMethod> bcV;
std::vector<asl::SPNumMethod> bcDif;
0.,
bathPlatformMap,
bathPlatformCrystalMap,
templ));
-9.32e-6/difC.
v()*dx.
v(),
crystalMap,
bathPlatformCrystalMap,
templ));
std::cout << "Finished" << endl;
std::cout << "Computing...";
writer.
addScalars(
"mapPlatformCrys", *platformCrysMap);
writer.
addScalars(
"mapBathPlatformCrystal", *bathPlatformCrystalMap);
for (unsigned int i(0); i <= 8001 ; ++i)
{
lbgk->execute();
nmDif->execute();
if (!(i%2000))
{
cout << i << endl;
}
}
cout << "Finished" << endl;
cout << "Computation statistic:" << endl;
cout <<
"Real Time = " << timer.
realTime() <<
"; Processor Time = " return 0;
}