28 #include <utilities/aslParametersManager.h> 29 #include <math/aslTemplates.h> 30 #include <aslGeomInc.h> 31 #include <math/aslPositionFunction.h> 32 #include <aslDataInc.h> 33 #include <acl/aclGenerators.h> 34 #include <acl/aclMath/aclVectorOfElements.h> 35 #include <writers/aslVTKFormatWriters.h> 36 #include <num/aslLBGK.h> 37 #include <num/aslLBGKBC.h> 38 #include <num/aslBasicBC.h> 39 #include <num/aslCrystalGrowthBC.h> 40 #include <num/aslFDAdvectionDiffusion.h> 41 #include <utilities/aslTimer.h> 82 vector<asl::AVec<>> pillar1{
makeAVec(wPillar*.5, dPillar*.5,0.),
83 makeAVec(-wPillar*.5, dPillar*.5,0.),
84 makeAVec(-wPillar*.5, -dPillar*.5,0.),
85 makeAVec(wPillar*.5, -dPillar*.5,0.)};
87 vector<asl::AVec<>> pillar2{
makeAVec(dPillar*.5, wPillar*.5,0.),
88 makeAVec(-dPillar*.5, wPillar*.5,0.),
89 makeAVec(-dPillar*.5, -wPillar*.5,0.),
90 makeAVec(dPillar*.5, -wPillar*.5,0.)};
92 vector<asl::AVec<>> pillarC{
makeAVec(center[0]+rDisk-dPillar*.5, center[1], 0.),
93 makeAVec(center[0]-rDisk+dPillar*.5, center[1], 0.),
94 makeAVec(center[0], center[1]+rDisk-dPillar*.5,0.),
95 makeAVec(center[0], center[1]-rDisk+dPillar*.5,0.)};
96 vector<vector<asl::AVec<>>> pillarsPoints(4);
97 for(
unsigned int i(0); i<4; ++i)
98 pillarsPoints[i].resize(4);
100 for(
unsigned int i(0); i<4; ++i)
102 pillarsPoints[0][i] = pillar2[i] + pillarC[0];
103 pillarsPoints[1][i] = pillar2[i] + pillarC[1];
104 pillarsPoints[2][i] = pillar1[i] + pillarC[2];
105 pillarsPoints[3][i] = pillar1[i] + pillarC[3];
111 makeAVec(center[0], center[1], .5*hDisk)));
114 makeAVec(center[0], center[1], -.5*hDisk - hAxis + dx*size[2])));
117 makeAVec(center[0], center[1], - .5*hAxis - hDisk*.25 + dx*size[2])));
122 auto dfPillars((dfPillar1 | dfPillar2 | dfPillar3 | dfPillar4) &
126 return normalize(diskBottom | diskTop | axis | dfPillars, dx);
133 double hCrystalBase(.5);
134 double hCrystalPyramid(.5);
143 center+
makeAVec(-aCrystal, aCrystal,0.),
144 center+
makeAVec(-aCrystal, -aCrystal,0.),
145 center+
makeAVec( aCrystal, -aCrystal,0.)}) &
148 auto cCrPyrBase(
makeAVec(center[0],center[1],hDisk+hCrystalBase-.01));
150 cCrPyrBase+
makeAVec(-aCrystal, aCrystal,0.),
151 cCrPyrBase+
makeAVec(-aCrystal, -aCrystal,0.),
152 cCrPyrBase+
makeAVec( aCrystal, -aCrystal,0.)},
153 cCrPyrBase+
makeAVec(0.,0.,hCrystalPyramid)));
154 return normalize(crystalB | crystalT, dx);
161 double wMax(6.*3.14*2./60.);
162 double tPlato(tPeriod * .25);
163 double tAcceleration(tPeriod * .1);
164 double tStop(tPeriod * .05);
167 double tRel(modf(t/tPeriod, &intPart));
169 if(tRel<=tAcceleration)
170 x = tRel / tAcceleration;
171 if(tRel>tAcceleration && tRel<=tAcceleration+tPlato)
173 if(tRel>tAcceleration+tPlato && tRel<=2.*tAcceleration+tPlato)
174 x = (2.*tAcceleration + tPlato - tRel) / tAcceleration;
175 if(tRel>2.*tAcceleration+tPlato && tRel<=2.*tAcceleration+tPlato+tStop)
177 if(tRel>2.*tAcceleration+tPlato+tStop && tRel<=3.*tAcceleration+tPlato+tStop)
178 x = -(tRel-2.*tAcceleration-tPlato-tStop) / tAcceleration;
179 if(tRel>3.*tAcceleration+tPlato+tStop && tRel<=3.*tAcceleration+2.*tPlato+tStop)
181 if(tRel>3.*tAcceleration+2.*tPlato+tStop && tRel<=4.*tAcceleration+2.*tPlato+tStop)
182 x = -(4.*tAcceleration+2.*tPlato+tStop-tRel)/tAcceleration;
183 if(tRel>4.*tAcceleration+2.*tPlato+tStop)
199 int main(
int argc,
char* argv[])
205 appParamsManager.
load(argc, argv);
210 Param difC(1e-2/300.);
213 Param w(6.*3.14*2./60.);
215 Param nuNum(nu.
v()*dt.
v()/dx.
v()/dx.
v());
216 Param difCNum(difC.
v()*dt.
v()/dx.
v()/dx.
v());
227 std::cout <<
"Data initialization...";
232 auto bathMap(asl::generateDataContainerACL_SP<FlT>(block, 1, 1u));
234 auto platformCrysMap(asl::generateDataContainerACL_SP<FlT>(block, 1, 1u));
236 auto bathPlatformMap(asl::generateDataContainerACL_SP<FlT>(block, 1, 1u));
238 auto bathPlatformCrystalMap(asl::generateDataContainerACL_SP<FlT>(block, 1, 1u));
240 auto crystalMap(asl::generateDataContainerACL_SP<FlT>(block, 1, 1u));
243 auto cField(asl::generateDataContainerACL_SP<FlT>(block, 1, 1u));
246 std::cout <<
"Finished" << endl;
248 std::cout <<
"Numerics initialization...";
266 std::vector<asl::SPNumMethod> bc;
267 std::vector<asl::SPNumMethod> bcV;
268 std::vector<asl::SPNumMethod> bcDif;
281 bathPlatformCrystalMap,
284 -9.32e-6/difC.
v()*dx.
v(),
286 bathPlatformCrystalMap,
293 std::cout <<
"Finished" << endl;
294 std::cout <<
"Computing...";
300 writer.
addScalars(
"mapPlatformCrys", *platformCrysMap);
301 writer.
addScalars(
"mapBathPlatformCrystal", *bathPlatformCrystalMap);
305 writer.
addVector(
"v", *lbgk->getVelocity());
315 for (
unsigned int i(0); i <= 8001 ; ++i)
335 std::cout <<
"Finished" << endl;
337 cout <<
"time=" << timer.
getTime() <<
"; clockTime=" 342 std::cout <<
"Output...";
343 std::cout <<
"Finished" << endl;
344 std::cout <<
"Ok" << endl;
const double getTime() const
const double getProcessorLoad() const
double getWRotation(double t)
Numerical method for fluid flow.
const double getClockTime() const
const AVec normalize(const AVec< T > &a)
void addVector(std::string name, AbstractData &data)
asl::UValue< double > Param
void initAll(std::vector< T * > &v)
SPDistanceFunction generateDFConvexPolygonPrism(std::vector< AVec< double >> points)
generates infinite prism with convex polygon at its base
SPDistanceFunction generateDFCylinderInf(double r, const AVec< double > &l, const AVec< double > &c)
generates infinite cylinder
SPDistanceFunction generateDFPlane(const AVec< double > &n, const AVec< double > &p0)
SPFDAdvectionDiffusion generateFDAdvectionDiffusion(SPDataWithGhostNodesACLData c, double diffustionCoeff, SPAbstractDataWithGhostNodes v, const VectorTemplate *vt, bool compressibilityCorrection=false)
acl::VectorOfElements dx(const TemplateVE &a)
differential operator
asl::SPDistanceFunction generateBath(asl::Block &bl)
SPDistanceFunction generateDFConvexPolygonPyramid(std::vector< AVec< double >> points, AVec< double > a)
generates pyramid with convex polygon at its base and apex a
asl::SPDistanceFunction generateCrystal(asl::Block &bl)
SPNumMethod generateBCVelocityVel(SPLBGK nm, SPPositionFunction v, SPAbstractDataWithGhostNodes map)
void initData(SPAbstractData d, double a)
SPNumMethod generateBCLinearGrowth2(SPAbstractDataWithGhostNodes d, double cEq, double beta, SPAbstractDataWithGhostNodes map, const VectorTemplate *const t)
SPBCond generateBCConstantGradient(SPAbstractDataWithGhostNodes d, double v, const VectorTemplate *const t, const std::vector< SlicesNames > &sl)
Bondary condition that makes fixed gradient.
void executeAll(std::vector< T * > &v)
void addScalars(std::string name, AbstractData &data)
const DV & getSize() const
int main(int argc, char *argv[])
VectorOfElements generateVEConstant(T a)
Generates VectorOfElements with 1 Element acl::Constant with value a.
SPPositionFunction generatePFRotationField(const AVec< double > &axis, const AVec< double > &c)
asl::SPDistanceFunction generatePlatform(asl::Block &bl)
SPDistanceFunction generateDFCylinder(double r, const AVec< double > &l, const AVec< double > &c)
generates cylinder
void load(int argc, char *argv[])
const VectorTemplate & d3q19()
Vector template.
SPNumMethod generateBCNoSlipVel(SPLBGK nmU, SPAbstractDataWithGhostNodes map)
for velocity field
contains different kernels for preprocessing and posprocessing of data used by LBGK ...
SPNumMethod generateBCVelocity(SPLBGK nm, SPPositionFunction v, SPAbstractDataWithGhostNodes map)
SPBCond generateBCNoSlip(SPLBGK nm, const std::vector< SlicesNames > &sl)