two_d_fp.cc File Reference

Classes

class  FpTestProblem
 Test problem for Fp/PCD preconditioner. More...
 

Namespaces

 Global_Variables
 Namespace for physical parameters.
 

Enumerations

enum  { Global_Variables::Driven_cavity , Global_Variables::Step }
 Enumeration for the problem ids. More...
 

Functions

int main (int argc, char **argv)
 Driver for Fp preconditioner. More...
 

Function Documentation

◆ main()

int main ( int argc  ,
char **  argv 
)

Driver for Fp preconditioner.

///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////

592 {
593 
594 
595 #ifdef OOMPH_HAS_MPI
596  MPI_Helpers::init(argc,argv);
597 #endif
598 
599 
600  //Label for output
601  DocInfo doc_info;
602 
603  //Set output directory
604  doc_info.set_directory("RESLT");
605 
606  //Doc number of gmres iterations
607  ofstream out_file;
608 
609  // Set flags
610  bool use_hypre_for_pressure=true;
611  bool use_block_diagonal_for_momentum=false;
612  bool use_hypre_for_momentum_diagonals=false;
613 
614  // Outermost loop over stress divergence or simple form
615  for (unsigned do_stress_div=0;do_stress_div<2;do_stress_div++)
616  {
617  if (do_stress_div)
618  {
619  oomph_info << "Doing stress divergence form\n";
622  }
623  else
624  {
625  oomph_info << "Doing simple form of viscous terms\n";
628  }
629 
630  //Loop over problems: Driven cavity and step
631  //unsigned problem_id=Global_Variables::Step;
632  for (unsigned problem_id=0;problem_id<2;problem_id++)
633  {
634 
635  if (problem_id==Global_Variables::Driven_cavity)
636  {
637  if (do_stress_div==1)
638  {
639  out_file.open("two_d_iter_driven_cavity_stress_div.dat");
640  }
641  else
642  {
643  out_file.open("two_d_iter_driven_cavity_simple.dat");
644  }
645  }
646  else if (problem_id==Global_Variables::Step)
647  {
648  if (do_stress_div==1)
649  {
650  out_file.open("two_d_iter_step_stress_div.dat");
651  }
652  else
653  {
654  out_file.open("two_d_iter_step_simple.dat");
655  }
656  }
657 
658  out_file
659  << "VARIABLES=\"nel_1d\","
660  << "\"ndof\","
661  << "\"Re\","
662  << "\" Newton iteration\","
663  << "\"GMRES iterations\","
664  << "\"Linear solver time\","
665  << "\"doc number\""
666  << std::endl;
667 
668  std::string header1;
669  std::string header2;
670 
671 
672  // Loop over preconditioners: iprec=0: LSC
673  // iprec=1: Fp
674  // iprec=2: Fp without Robin
675  bool use_lsc=true;
676  bool use_robin=true;
677  for (unsigned iprec=0;iprec<2;iprec++)
678  {
679 
680  // Loop over three cases (triangles, non-refineable/refineable quads)
681  unsigned icase_lo=0;
682  unsigned icase_hi=2;
683  if (problem_id==Global_Variables::Step)
684  {
685  // No triangles for backward step
686  icase_lo=1;
687  icase_hi=2;
688  }
689  for (unsigned icase=icase_lo;icase<=icase_hi;icase++)
690  {
691  bool use_triangles=false;
692  bool use_adaptivity=false;
693 
694  switch(icase)
695  {
696 
697  case 0:
698 
699  header1=" Triangles";
700  use_triangles=true;
701  use_adaptivity=false;
702  break;
703 
704  case 1:
705 
706  header1=" Quads";
707  use_triangles=false;
708  use_adaptivity=false;
709  break;
710 
711  case 2:
712 
713  header1=" Refineable Quads";
714  use_triangles=false;
715  use_adaptivity=true;
716  break;
717 
718  default:
719  break;
720  }
721 
722  oomph_info << "Doing it with " << header1 << std::endl;
723 
724  // Set preconditioner
725  if (iprec==0)
726  {
727  use_lsc=true;
728  header2=", LSC";
729  }
730  else if (iprec==1)
731  {
732  use_lsc=false;
733  use_robin=true;
734  header2=", Fp";
735  }
736  else if (iprec==2)
737  {
738  use_lsc=false;
739  use_robin=false;
740  header2=", Fp without Robin";
741  }
742 
743  oomph_info << "Doing it with " << header2 << " preconditioner\n";
744 
745  // Write tecplot header
746  string header="ZONE T=\""+header1+header2+"\"\n";
747  out_file << header;
748 
749  // Number of elements in x/y directions (reduced for validaton)
750  unsigned max_nel_1d=32;
751  if (argc>1) max_nel_1d=2;
752  for (unsigned nel_1d = 2; nel_1d <= max_nel_1d; nel_1d*=2)
753  {
754 
755  // Build the problem
757  nel_1d,use_triangles,use_adaptivity,use_lsc,use_robin,
758  use_hypre_for_pressure,use_block_diagonal_for_momentum,
759  use_hypre_for_momentum_diagonals,problem_id);
760 
761  // Refine a few times
762  if (use_adaptivity)
763  {
764  Vector<unsigned> elements_to_be_refined;
765  unsigned nel=problem.mesh_pt()->nelement();
766  unsigned e=0;
767  while (e<nel)
768  {
769  elements_to_be_refined.push_back(e);
770  e+=7;
771  }
772  problem.refine_selected_elements(elements_to_be_refined);
773  elements_to_be_refined.clear();
774  elements_to_be_refined.push_back(1);
775  problem.refine_selected_elements(elements_to_be_refined);
776  elements_to_be_refined.clear();
777  elements_to_be_refined.push_back(4);
778  problem.refine_selected_elements(elements_to_be_refined);
779 
780  }
781 
782 // DocInfo my_doc_info;
783 // switch(icase)
784 // {
785 
786 // case 0:
787 
788 // problem.validate_fp<TTaylorHoodElement<2> >();
789 // pause("done validation");
790 
791 // break;
792 
793 // case 1:
794 
795 // problem.validate_fp<QTaylorHoodElement<2> >();
796 // pause("done validation");
797 
798 // break;
799 
800 // case 2:
801 
802 
803 // problem.validate_fp<RefineableQTaylorHoodElement<2> >();
804 // pause("done validation");
805 
806 // break;
807 
808 // default:
809 // break;
810 // }
811 
812 
813  // Loop over Reynolds numbers (limited during validation)
814  double start_re = 50.0;
815  if (argc>1) start_re=50;
816  double end_re = 50.0;
817  for (double re = start_re; re <= end_re; re+=50.0)
818  {
819 
820  // Set Reynolds
822 
823  // Solve the problem
824  problem.newton_solve();
825 
826  // Doc solution
827  problem.doc_solution(doc_info);
828  doc_info.number()++;
829 
830  // Doc iteration counts for each Newton iteration
831  unsigned ndof = problem.ndof();
832  unsigned iter = Global_Variables::Iterations.size();
833 
834  // Doc for all Newton iterations or only the last one?
835  unsigned j_lo=0;
836  //j_lo=iter-1;
837  for (unsigned j = j_lo; j < iter; j++)
838  {
839  out_file
840  << nel_1d << " "
841  << ndof << " "
842  << re << " "
843  << j << " "
846  << doc_info.number()-1 << " "
847  << std::endl;
848  }
849 
850  }
851  }
852  }
853  }
854 
855  out_file.close();
856 
857  }
858 
859  }
860 
861 
862 #ifdef OOMPH_HAS_MPI
863  MPI_Helpers::finalize();
864 #endif
865 
866 
867  } // end_of_main
Array< double, 1, 3 > e(1./3., 0.5, 2.)
Test problem for Fp/PCD preconditioner.
Definition: three_d_fp.cc:114
Definition: oomph_utilities.h:499
void set_directory(const std::string &directory)
Definition: oomph_utilities.cc:298
unsigned & number()
Number used (e.g.) for labeling output files.
Definition: oomph_utilities.h:554
Definition: navier_stokes_elements.h:395
@ Driven_cavity
Definition: three_d_fp.cc:76
@ Step
Definition: two_d_fp.cc:75
Vector< unsigned > Iterations
Storage for number of iterations during Newton steps.
Definition: two_d_tilted_square.cc:111
Vector< double > Linear_solver_time
Storage for linear solver times during Newton steps.
Definition: three_d_fp.cc:86
double Re
Reynolds number.
Definition: two_d_tilted_square.cc:80
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
Constructor for SteadyAxisymAdvectionDiffusion problem
Definition: steady_axisym_advection_diffusion.cc:213
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References Global_Variables::Driven_cavity, e(), Global_Variables::Iterations, j, Global_Variables::Linear_solver_time, oomph::DocInfo::number(), oomph::oomph_info, problem, Global_Variables::Re, oomph::DocInfo::set_directory(), Global_Variables::Step, and oomph::Global_string_for_annotation::string().