Line data Source code
1 : #include <AMReX_MLPoisson.H>
2 :
3 : #include "CahnHilliard.H"
4 : #include "BC/Nothing.H"
5 : #include "Numeric/Stencil.H"
6 :
7 : namespace Integrator
8 : {
9 0 : CahnHilliard::CahnHilliard() : Integrator()
10 : {
11 0 : bc = new BC::Nothing();
12 0 : ic = new IC::Random(geom,2.0);
13 0 : RegisterNewFab(etanewmf, bc, ncomp, nghost, "Eta",true);
14 0 : RegisterNewFab(etaoldmf, bc, ncomp, nghost, "EtaOld",false);
15 0 : RegisterNewFab(intermediate, bc, ncomp, nghost, "int",false);
16 0 : LPInfo info;
17 0 : op.define(geom,grids,dmap,*bc,info);
18 0 : }
19 :
20 :
21 : void
22 0 : CahnHilliard::TimeStepBegin(amrex::Real /*time*/, int /*iter*/)
23 : {
24 : // amrex::MLPoisson myop(geom,grids,dmap);
25 : // amrex::MLMG solver(myop);
26 : // solver.setMaxIter(elastic.max_iter);
27 : // solver.setMaxFmgIter(elastic.max_fmg_iter);
28 : // solver.setVerbose(elastic.verbose);
29 : // solver.setCGVerbose(elastic.cgverbose);
30 :
31 : // etanewmf[0]->setVal(0.0);
32 : // etanewmf[0]->setVal(0.0);
33 :
34 : // Set::Scalar tol_rel = 1E-8;
35 : // Set::Scalar tol_abs = 0.0;
36 : // solver.solve(GetVecOfPtrs(etanewmf),
37 : // GetVecOfConstPtrs(etaoldmf),
38 : // tol_rel,
39 : // tol_abs);
40 :
41 0 : }
42 :
43 : void
44 0 : CahnHilliard::Advance (int lev, Set::Scalar /*time*/, Set::Scalar dt)
45 : {
46 0 : std::swap(etaoldmf[lev], etanewmf[lev]);
47 0 : const amrex::Real* DX = geom[lev].CellSize();
48 0 : for ( amrex::MFIter mfi(*etanewmf[lev],true); mfi.isValid(); ++mfi )
49 : {
50 0 : const amrex::Box& bx = mfi.tilebox();
51 0 : amrex::Array4<const amrex::Real> const& eta = etaoldmf[lev]->array(mfi);
52 0 : amrex::Array4<amrex::Real> const& inter = intermediate[lev]->array(mfi);
53 0 : amrex::Array4<amrex::Real> const& etanew = etanewmf[lev]->array(mfi);
54 :
55 0 : amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(int i, int j, int k){
56 : Set::Scalar lap =
57 0 : Numeric::Stencil<Set::Scalar,2,0,0>::D(eta,i,j,k,0,DX) +
58 0 : Numeric::Stencil<Set::Scalar,2,0,0>::D(eta,i,j,k,0,DX);
59 :
60 0 : inter(i,j,k) =
61 0 : eta(i,j,k)*eta(i,j,k)*eta(i,j,k)
62 0 : - eta(i,j,k)
63 0 : - gamma*lap;
64 :
65 :
66 0 : etanew(i,j,k) = eta(i,j,k) - dt*inter(i,j,k); // Allen Cahn
67 0 : });
68 :
69 0 : amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(int i, int j, int k){
70 : Set::Scalar lap =
71 0 : Numeric::Stencil<Set::Scalar,2,0,0>::D(inter,i,j,k,0,DX) +
72 0 : Numeric::Stencil<Set::Scalar,2,0,0>::D(inter,i,j,k,0,DX);
73 :
74 0 : etanew(i,j,k) = eta(i,j,k) + dt*lap;
75 0 : });
76 :
77 : }
78 0 : }
79 :
80 : void
81 0 : CahnHilliard::Initialize (int lev)
82 : {
83 0 : etanewmf[lev]->setVal(-1.);
84 0 : etaoldmf[lev]->setVal(-1.);
85 0 : ic->Add(lev,etanewmf);
86 0 : ic->Add(lev,etaoldmf);
87 0 : }
88 :
89 :
90 : void
91 0 : CahnHilliard::TagCellsForRefinement (int /*lev*/, amrex::TagBoxArray& /*tags*/, amrex::Real /*time*/, int /*ngrow*/)
92 : {
93 0 : }
94 :
95 :
96 : }
|