
#include "setup/Physics.hpp"
#include "setup/Numerics.hpp"

// takes arguments:
// vector<string> solverKeys  - vector of solver keys for multiphysics
// vector<int> timeTypesIds -  vector of IDs of time types (steady, transient or harmonic) for multiphysics
// bool withinitialization - does case contain initialization from previous calculation?
// vector<string> preResolKeys  - vector of solver keys for pre resolution
// vector<int> preResolTypesIds -  vector of IDs of time types (steady, transient or harmonic) for pre resolution
// returns string of resolution file header
std::string resolutionHeader(std::vector<std::string>, std::vector<Physics::timeType>, std::vector<std::string>, std::vector<std::string> , std::vector<Physics::timeType>);


//takes arguments:
// vector<int> timeTypeIds - vector of IDs of time types (steady, transient or harmonic) for multiphysics
// bool negativeStartTime - if start time is negative, contunuation of simulation will be done, no initialization necessary
// returns string of initialization operation definitions:
// deletes times.dat, initializes solution, saves initial solution if it is of type transient, prints time 0 to times.dat
std::string initilizationOperations(std::vector<std::map<std::string, InputValue>>, std::vector<Physics::timeType>, std::vector<std::string>, std::vector<std::string>);


//takes arguments:
// vector<map<string, inputValue>> timePars - vector of time parameters (map<string, inputValue> key is name of time parameter)
// vector<int> timeTypeIds - vector of IDs of time types (steady, transient or harmonic) for multiphysics
// returns string time loop opening (TimeLoopTheta or TimeLoopAdaptive)
std::string timeLoopOpen(std::vector<std::map<std::string, InputValue>>, std::vector<Physics::timeType>, std::vector<std::string>);


std::string timeAdaptiveSplit(std::vector<std::map<std::string, InputValue>>, std::vector<Physics::timeType>);
std::string timeLoopClose(std::vector<Physics::timeType>, std::vector<std::string> );


std::string outerLoopAccurateOpen(std::vector<bool>, Numerics::ALGO, int, float, float);
std::string outerLoopAccurateClose(std::vector<bool>, Numerics::ALGO);

std::string finalizeTimeStep(std::vector<std::map<std::string, InputValue>>, std::vector<std::string>, std::vector<Physics::timeType>);

std::string solutionLoops(std::vector<bool>, Numerics::ALGO, std::vector<std::map<std::string, InputValue>>, int, float, float,
	std::vector<std::shared_ptr<PostValues>>, std::vector<std::string>, std::vector<std::map<std::string, InputValue>>, bool); 
std::string subPhysicsLoop(int, bool, std::vector<std::map<std::string, InputValue>>, int, std::vector<int>, std::vector<std::string>, std::shared_ptr<PostValues> scaling_post);
std::string closeOperations();
std::string closeResolution();
