diff --git a/demo/src/cahn_hilliard.cc b/demo/src/cahn_hilliard.cc new file mode 100644 index 0000000000000000000000000000000000000000..bb198d1c4e7fc096395554fba316f0b459575dd1 --- /dev/null +++ b/demo/src/cahn_hilliard.cc @@ -0,0 +1,99 @@ +#include "AMDiS.h" +#include "CouplingTimeInterface.h" +#include "Refinement.h" +#include "MeshFunction_Level.h" +#include "CahnHilliard.h" +#include "Views.h" + +#include "boost/date_time/posix_time/posix_time.hpp" + +using namespace AMDiS; +using namespace boost::posix_time; + +class RefinementTimeInterface : public CouplingTimeInterface +{ +public: + + RefinementTimeInterface(CahnHilliard *chProb_) : + chProb(chProb_), + refFunction(NULL), + refinement(NULL) + { + addTimeInterface(chProb); + } + + ~RefinementTimeInterface() + { + if (refFunction) + delete refFunction; + if (refinement) + delete refinement; + } + + virtual void initTimeInterface() + { + chProb->initTimeInterface(); + } + + /// Called at the end of each timestep. + virtual void closeTimestep(AdaptInfo *adaptInfo) + { + CouplingTimeInterface::closeTimestep(adaptInfo); + + refinement->refine(2); + } + + /// Set initial condition and perform initial refinement + virtual void solveInitialProblem(AdaptInfo *adaptInfo) + { + refFunction= new PhaseFieldRefinement(chProb->getMesh()); + refinement= new RefinementLevelDOF( + chProb->getProblem(0)->getFeSpace(), + refFunction, + new PhaseDOFView<double>(chProb->getProblem(0)->getSolution()->getDOFVector(0))); + + // initial refinement + refinement->refine(0); + + // refine until interfaces is solved + for (int i = 0; i < 3; ++i) { + chProb->solveInitialProblem(adaptInfo); + refinement->refine((i < 4 ? 4 : 10)); + } + + CouplingTimeInterface::solveInitialProblem(adaptInfo); + } + +protected: + + CahnHilliard *chProb; + PhaseFieldRefinement* refFunction; + RefinementLevelDOF *refinement; +}; + + +int main(int argc, char** argv) +{ FUNCNAME("main"); + + AMDiS::init(argc, argv); + + CahnHilliard chProb("ch"); + chProb.initialize(INIT_ALL); + + RefinementTimeInterface timeInterface(&chProb); + + // Adapt-Infos + AdaptInfo adaptInfo("adapt", chProb.getNumComponents()); + AdaptInstationary adaptInstat("adapt", chProb, adaptInfo, timeInterface, adaptInfo); + + ptime start_time = microsec_clock::local_time(); + timeInterface.initTimeInterface(); // fill operators and BC + int error_code = adaptInstat.adapt(); + time_duration td = microsec_clock::local_time()-start_time; + + MSG("elapsed time= %d sec\n", td.total_seconds()); + + AMDiS::finalize(); + + return error_code; +};