PlasCom2  1.0
XPACC Multi-physics simluation application
Simulation.H
Go to the documentation of this file.
1 #ifndef __SIMULATION_H__
2 #define __SIMULATION_H__
3 
4 #include <vector>
5 
6 #include "mpi.h"
7 
8 #include "Application.H"
9 #include "PCPPProgram.H"
10 #include "Grid.H"
11 #include "State.H"
12 #include "Domain.H"
13 #include "Geometry.H"
14 #include "Advancer.H"
15 #include "RHS.H"
16 
17 using namespace fixtures;
18 
19 namespace simulation {
20 
21  // class base : public application::base
22  template<typename DomainBaseT>
24  {
25 
26 
27  public:
28 
29  typedef DomainBaseT DomainBaseType;
30  typedef typename DomainBaseType::GridType GridType;
31  typedef typename DomainBaseType::StateType StateType;
32  typedef std::vector<DomainBaseType> domainvector;
34  typedef std::vector<AdvancerType *> advancervector;
36  typedef std::vector<DomainInitializerType> initializervector;
39 
40  protected:
41 
43 
44  // int numDomains;
45  DomainInfoType domainInfo;
46  GeometryInfoType geometryInfo;
47  domainvector appDomains;
48  advancervector domainAdvancers;
49  initializervector domainInitializers;
50 
52  int iStep;
56 
57  public:
58 
59  // Every parallel application must have this constructor
60  application(int numArgs,char **argList,MPI_Comm mpiCommunicator) :
61  pcpp::parallelprogram(numArgs,argList,mpiCommunicator),
62  errorState(0), iStep(0), numStepsMax(0), numStepsIO(0), numStepsStatus(0)
63  {};
64 
65  // Functions all applications must define
66  virtual int ConfigureApplication() { return(0); };
67  virtual int RunApplication()
68  {
69  int initializeRunCode = InitializeRun();
70  if(initializeRunCode){
71  ErrOut("InitializeRun returned error code.\n");
72  return(initializeRunCode);
73  }
74  bool keepGoing = !Finished();
75  while(keepGoing){
76  int initStepCode = InitializeStep();
77  if(initStepCode){
78  ErrOut("InitializeStep returned error code.\n");
79  return(initStepCode);
80  }
81  int advanceCode = Advance();
82  if(advanceCode){
83  ErrOut("Advance returned error code.\n");
84  return(advanceCode);
85  }
86  int finalizeStepCode = FinalizeStep();
87  if(finalizeStepCode){
88  ErrOut("FinalizeStep returned error code.\n");
89  return(finalizeStepCode);
90  }
91  keepGoing = !Finished();
92  }
93  int finalizeRunCode = FinalizeRun();
94  if(finalizeRunCode){
95  ErrOut("FinalizeStep returned error code.\n");
96  return(finalizeRunCode);
97  }
98  return(0);
99  };
100  virtual int InitializeApplication() {return(0);};
101  virtual int FinalizeApplication() {return(0);};
102 
103  // These functions are specific to simulation applications
104  virtual int AdvanceDomains()
105  {
106  for(int iDomain = 0;iDomain < domainInfo.numDomains;iDomain++)
107  {
108  DomainBaseType &appDomain(appDomains[iDomain]);
109  AdvancerType &domainAdvancer(*domainAdvancers[iDomain]);
110  int advanceCode = domainAdvancer.AdvanceDomain();
111  if(advanceCode){
112  return(advanceCode);
113  }
114  }
115  return(0);
116  };
117  virtual bool Finished() { return(true); };
118  virtual int InitializeRun()
119  {
120  int initCode = InitializeDomains();
121  if(initCode){
122  return(initCode);
123  }
124  return(0);
125  };
126  virtual int InitializeDomains()
127  {
128  FunctionEntry("InitDomains");
129  if(Restart()){
130  return(RestartDomains());
131  } else {
132  for(int iDomain = 0;iDomain < domainInfo.numDomains;iDomain++)
133  {
134  DomainBaseType &appDomain(appDomains[iDomain]);
135  DomainInitializerType &domainInitializer(domainInitializers[iDomain]);
136  int initCode = domainInitializer.InitializeDomain(appDomain);
137  if(initCode){
138  return(initCode);
139  }
140  }
141  }
142  FunctionExit("InitDomains");
143  return(WriteDomains());
144  };
145  virtual int Advance()
146  {
147  FunctionEntry("Advance");
148  int advanceCode = AdvanceDomains();
149  if(advanceCode){
150  return(advanceCode);
151  }
152  FunctionExit("Advance");
153  return(0);
154  };
155  virtual int FinalizeRun()
156  {
157  FunctionEntry("FinalizeRun");
158  int finalizeCode = FinalizeDomains();
159  if(finalizeCode){
160  return(finalizeCode);
161  }
162  FunctionExit("FinalizeRun");
163  return(0);
164  };
165  virtual int FinalizeDomains()
166  {
167  FunctionEntry("FinalizeDomains");
168  bool doRestart = !RestartStep();
169  if(doRestart){
170  WriteRestart();
171  }
172  FunctionExit("FinalizeDomains");
173  return(0);
174  };
175  virtual bool RestartStep() {return(true);};
176  virtual bool OutputStep() {return(true);};
177  virtual int InitializeStep()
178  {
179  FunctionEntry("InitializeStep");
180  for(int iDomain = 0;iDomain < domainInfo.numDomains;iDomain++)
181  {
182  DomainBaseType &appDomain(appDomains[iDomain]);
183  AdvancerType &domainAdvancer(*domainAdvancers[iDomain]);
184  int advanceInitCode = domainAdvancer.InitializeAdvance();
185  if(advanceInitCode){
186  return(advanceInitCode);
187  }
188  }
189  FunctionExit("InitializeStep");
190  return(0);
191  };
192  virtual int FinalizeStep()
193  {
194  FunctionEntry("FinalizeStep");
195  for(int iDomain = 0;iDomain < domainInfo.numDomains;iDomain++)
196  {
197  DomainBaseType &appDomain(appDomains[iDomain]);
198  AdvancerType &domainAdvancer(*domainAdvancers[iDomain]);
199  int advanceFinalizeCode = domainAdvancer.FinalizeAdvance();
200  if(advanceFinalizeCode){
201  return(advanceFinalizeCode);
202  }
203  }
204  if(OutputStep()){
205  int writeOutputCode = WriteDomains();
206  if(writeOutputCode){
207  return(writeOutputCode);
208  }
209  }
210  if(RestartStep()){
211  int writeRestartCode = WriteRestart();
212  if(writeRestartCode){
213  return(writeRestartCode);
214  }
215  }
216  FunctionExit("FinalizeStep");
217  return(0);
218  };
219 
220  virtual int RestartDomains() { return(0); };
221  virtual int WriteDomains() { return(0); };
222  virtual int ReadDomains() { return(0); };
223  virtual int WriteRestart() { return(0); };
224  virtual int Restart() { return(0); };
225  virtual int ConfigureSimulation() { return(0); };
226  virtual int InitializeSimulation() { return(0); };
227  virtual int ConfigureDomains() { return(0); };
228 
229  DomainInfoType DomainInfo(){ return (domainInfo); };
230  int NumberOfDomains(){ return (domainInfo.numDomains); };
231  domainvector &GetDomains(){ return appDomains; };
232 
233  };
234 
235  // typedef application ApplicationType;
236 
237 // namespace util {
238 // int ConfigureMeta(fixtures::ConfigurationType &inConfig,field::metadataset &inMeta,
239 // std::ostream &messageStream);
240 // }
241 
242 };
243 
244 #endif
245 //
246 //
virtual int InitializeSimulation()
Definition: Simulation.H:226
virtual int AdvanceDomain()
Definition: Advancer.H:43
domain::info DomainInfoType
Definition: Simulation.H:37
virtual int ConfigureApplication()
Definition: Simulation.H:66
virtual int RestartDomains()
Definition: Simulation.H:220
virtual int InitializeApplication()
Definition: Simulation.H:100
virtual int InitializeDomains()
Definition: Simulation.H:126
virtual bool RestartStep()
Definition: Simulation.H:175
virtual int FinalizeApplication()
Definition: Simulation.H:101
virtual int InitializeRun()
Definition: Simulation.H:118
std::vector< DomainBaseType > domainvector
Definition: Simulation.H:32
DomainInfoType DomainInfo()
Definition: Simulation.H:229
DomainBaseType::GridType GridType
Definition: Simulation.H:30
Base program definitions for Plascom2.
virtual int InitializeAdvance()
Definition: Advancer.H:35
virtual int FinalizeAdvance()
Definition: Advancer.H:47
application(int numArgs, char **argList, MPI_Comm mpiCommunicator)
Definition: Simulation.H:60
virtual int WriteDomains()
Definition: Simulation.H:221
domainvector appDomains
Definition: Simulation.H:47
advancervector domainAdvancers
Definition: Simulation.H:48
virtual int InitializeDomain(DomainType &inDomain)
Definition: Domain.H:1039
virtual bool OutputStep()
Definition: Simulation.H:176
virtual int FinalizeRun()
Definition: Simulation.H:155
DomainBaseType::StateType StateType
Definition: Simulation.H:31
std::vector< DomainInitializerType > initializervector
Definition: Simulation.H:36
DomainBaseT DomainBaseType
Definition: Simulation.H:29
virtual int ConfigureDomains()
Definition: Simulation.H:227
virtual int Restart()
Definition: Simulation.H:224
virtual int WriteRestart()
Definition: Simulation.H:223
virtual int ConfigureSimulation()
Definition: Simulation.H:225
virtual int RunApplication()
Definition: Simulation.H:67
virtual int FinalizeStep()
Definition: Simulation.H:192
domain::Initializer< DomainBaseType > DomainInitializerType
Definition: Simulation.H:35
DomainInfoType domainInfo
Definition: Simulation.H:45
GeometryInfoType geometryInfo
Definition: Simulation.H:46
virtual int ReadDomains()
Definition: Simulation.H:222
advancer::base< DomainBaseType > AdvancerType
Definition: Simulation.H:33
initializervector domainInitializers
Definition: Simulation.H:49
virtual int InitializeStep()
Definition: Simulation.H:177
virtual int AdvanceDomains()
Definition: Simulation.H:104
virtual int Advance()
Definition: Simulation.H:145
fixtures::ConfigurationType appConfig
Definition: Simulation.H:42
std::vector< AdvancerType * > advancervector
Definition: Simulation.H:34
virtual bool Finished()
Definition: Simulation.H:117
virtual int FinalizeDomains()
Definition: Simulation.H:165
geometry::info GeometryInfoType
Definition: Simulation.H:38
domainvector & GetDomains()
Definition: Simulation.H:231