We give Swig a try
This commit is contained in:
parent
d1cfd774fe
commit
c7e3f5fb1e
@ -1,9 +1,18 @@
|
|||||||
# CMakeList.txt for linear code
|
# CMakeList.txt for linear code
|
||||||
cmake_minimum_required (VERSION 2.8.9)
|
cmake_minimum_required (VERSION 3.1)
|
||||||
|
|
||||||
project(Timedomain1DEuler)
|
project(Timedomain1DEuler)
|
||||||
|
|
||||||
add_definitions(-DTRACERNAME=timedomaineuler -DARMA_USE_BLAS -DARMA_USE_LAPACK)
|
FIND_PACKAGE(SWIG REQUIRED)
|
||||||
|
INCLUDE(${SWIG_USE_FILE})
|
||||||
|
FIND_PACKAGE(PythonLibs)
|
||||||
|
|
||||||
|
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
|
||||||
|
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
||||||
|
SET(CMAKE_SWIG_FLAGS "-Wall")
|
||||||
|
|
||||||
|
|
||||||
|
add_definitions(-DTRACERNAME=timedomaineulertracer -DARMA_USE_BLAS -DARMA_USE_LAPACK)
|
||||||
|
|
||||||
############################## Not so often changed
|
############################## Not so often changed
|
||||||
|
|
||||||
@ -15,7 +24,7 @@ add_definitions(-DTRACERNAME=timedomaineuler -DARMA_USE_BLAS -DARMA_USE_LAPACK)
|
|||||||
|
|
||||||
set (CMAKE_GCC " -Wno-unused-function -ffunction-sections -fdata-sections -Wno-unused-local-typedefs -Wno-empty-body")
|
set (CMAKE_GCC " -Wno-unused-function -ffunction-sections -fdata-sections -Wno-unused-local-typedefs -Wno-empty-body")
|
||||||
|
|
||||||
set (CMAKE_GENERAL "${CMAKE_GENERAL} -std=c++11 -pipe -O2 -fPIC -Wall \
|
set (CMAKE_GENERAL "${CMAKE_GENERAL} -march=native -std=c++11 -pipe -O2 -fPIC -Wall \
|
||||||
-Wextra -Wno-unused-parameter \
|
-Wextra -Wno-unused-parameter \
|
||||||
-Wno-unused-variable -Wno-unused-but-set-variable \
|
-Wno-unused-variable -Wno-unused-but-set-variable \
|
||||||
-Wno-return-local-addr -Wno-cpp -Wno-address")
|
-Wno-return-local-addr -Wno-cpp -Wno-address")
|
||||||
@ -25,6 +34,7 @@ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_GENERAL} ${CMAKE_GCC}")
|
|||||||
# link_directories(${link_directories} /usr/local/lib)
|
# link_directories(${link_directories} /usr/local/lib)
|
||||||
set (tdir /home/anne/wip/tmtubes/src)
|
set (tdir /home/anne/wip/tmtubes/src)
|
||||||
include_directories(
|
include_directories(
|
||||||
|
# ${PYTHON_INCLUDE}
|
||||||
${tdir}/nonlinear/sys
|
${tdir}/nonlinear/sys
|
||||||
${tdir}/nonlinear/seg
|
${tdir}/nonlinear/seg
|
||||||
${tdir}/nonlinear/geom
|
${tdir}/nonlinear/geom
|
||||||
@ -36,9 +46,14 @@ include_directories(
|
|||||||
)
|
)
|
||||||
AUX_SOURCE_DIRECTORY(src src)
|
AUX_SOURCE_DIRECTORY(src src)
|
||||||
link_directories(/home/anne/bin/lib)
|
link_directories(/home/anne/bin/lib)
|
||||||
add_executable(timedomaineuler timedomain.cpp ${src})
|
|
||||||
|
|
||||||
target_link_libraries(timedomaineuler nonlin armadillo boost_program_options)
|
add_library(sources ${src})
|
||||||
|
set_source_files_properties(timedomain.i PROPERTIES CPLUSPLUS ON)
|
||||||
|
set_source_files_properties(timedomain.i PROPERTIES SWIG_FLAGS "-py3")
|
||||||
|
set_source_files_properties(timedomain.i PROPERTIES SWIG_FLAGS "-Wextra")
|
||||||
|
|
||||||
|
swig_add_module(timedomaineuler python timedomain.i)
|
||||||
|
swig_link_libraries(timedomaineuler sources nonlin armadillo ${PYTHON_LIBRARIES})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
75
Plot data.ipynb
Normal file
75
Plot data.ipynb
Normal file
File diff suppressed because one or more lines are too long
106
main.cpp
Normal file
106
main.cpp
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
#include "tube.h"
|
||||||
|
#include "tracer.h"
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <boost/program_options.hpp>
|
||||||
|
#include <ctime>
|
||||||
|
TRACETHIS;
|
||||||
|
|
||||||
|
using geom::Geom;
|
||||||
|
using geom::Grid;
|
||||||
|
namespace po = boost::program_options;
|
||||||
|
using namespace td;
|
||||||
|
SPOILNAMESPACE;
|
||||||
|
|
||||||
|
// Directory for storage
|
||||||
|
const char* dir="results";
|
||||||
|
|
||||||
|
|
||||||
|
inline double min(d x,d y){return x<y?x:y;}
|
||||||
|
|
||||||
|
int main(int argc,char *argv[]){
|
||||||
|
|
||||||
|
d f=85.785;
|
||||||
|
int loglevel=20;
|
||||||
|
|
||||||
|
po::options_description desc("Allowed options");
|
||||||
|
desc.add_options()
|
||||||
|
("help", "Produce help message")
|
||||||
|
("frequency",po::value<d>(&f)->default_value(100))
|
||||||
|
;
|
||||||
|
d T=1/f;
|
||||||
|
d L=1;
|
||||||
|
us gp=500;
|
||||||
|
|
||||||
|
d dx=L/(gp-1); // One left and right gp, so
|
||||||
|
d CFL=0.95;
|
||||||
|
// This is questionable
|
||||||
|
d dt=min(CFL*dx/gc.c0(),T/50);
|
||||||
|
cout << "dt:" << dt <<"\n";
|
||||||
|
cout << "dx:" << dx <<"\n";
|
||||||
|
|
||||||
|
td::gc=tasystem::Globalconf::airSTP(0,f,1);
|
||||||
|
cout << "omg:" << td::gc.getomg() << endl;
|
||||||
|
inittrace(loglevel);
|
||||||
|
initothertrace(loglevel,nltracer);
|
||||||
|
|
||||||
|
|
||||||
|
// Create results dir, put all stuff in
|
||||||
|
mkdir(dir,S_IRWXU | S_IRWXG);
|
||||||
|
// Empty this directory
|
||||||
|
|
||||||
|
td::Tube t(L,gp);
|
||||||
|
|
||||||
|
|
||||||
|
int nsaves_per_period=50;
|
||||||
|
|
||||||
|
int approx_instances_per_period=round(T/dt);
|
||||||
|
if(nsaves_per_period>approx_instances_per_period){ // Not good..
|
||||||
|
WARN("Error: to many saves for number of time instances available. Try adjusting nsaves_per_period Exiting..");
|
||||||
|
exit(192);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
d time=0;
|
||||||
|
|
||||||
|
us loopnr=1;
|
||||||
|
us savenr=0;
|
||||||
|
us saves_per_period=20;
|
||||||
|
|
||||||
|
d tbetweensaves=T/saves_per_period;
|
||||||
|
|
||||||
|
d tlastsave=0;
|
||||||
|
|
||||||
|
std::stringstream pfilename,ufilename;
|
||||||
|
pfilename << dir; ufilename << dir;
|
||||||
|
pfilename << "/p.dat";
|
||||||
|
ufilename << "/u.dat";
|
||||||
|
std::ofstream p(pfilename.str());
|
||||||
|
std::ofstream u(ufilename.str());
|
||||||
|
p << "#Pressure data vs gridpoint. gp=" << gp << "\n";
|
||||||
|
u << "#Velocity data vs gridpoint. gp=" << gp << "\n";
|
||||||
|
|
||||||
|
t.getSol().save(p,data::p);
|
||||||
|
t.getSol().save(u,data::u);
|
||||||
|
const clock_t begin_time = std::clock();
|
||||||
|
while(time<180*T){
|
||||||
|
t.DoIntegration(dt);
|
||||||
|
time=t.getTime();
|
||||||
|
|
||||||
|
if(time-tlastsave>tbetweensaves){
|
||||||
|
tlastsave=time;
|
||||||
|
savenr++;
|
||||||
|
t.getSol().save(p,data::p);
|
||||||
|
t.getSol().save(u,data::u);
|
||||||
|
cout << "Saving for t= " << time << " s.\n";
|
||||||
|
} // ti%10
|
||||||
|
loopnr++;
|
||||||
|
}
|
||||||
|
d comptime=std::clock()-begin_time;
|
||||||
|
p << "#Total time required to obtain solution: " << comptime/CLOCKS_PER_SEC <<" \n";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
50
pmovie.py
Executable file
50
pmovie.py
Executable file
@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
from numpy import *
|
||||||
|
from matplotlib.pyplot import *
|
||||||
|
from matplotlib import animation
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
inst=0
|
||||||
|
print("Loading data...")
|
||||||
|
pdat=loadtxt('results/p.dat')
|
||||||
|
# save(pdat,'p.npy')
|
||||||
|
|
||||||
|
gp=300 # Need to be taken from file
|
||||||
|
|
||||||
|
xmax=pdat[-1,0]
|
||||||
|
x=linspace(0,1,300)
|
||||||
|
|
||||||
|
fig = figure(figsize=(12,8))
|
||||||
|
ax = axes(xlim=(0,1),ylim=(-180,180))
|
||||||
|
grid('on')
|
||||||
|
line, = plot([],[],lw=2)
|
||||||
|
|
||||||
|
ponly=pdat[:,1]
|
||||||
|
imax=int(floor(pdat.shape[0]/gp))
|
||||||
|
|
||||||
|
p=array_split(ponly,imax)
|
||||||
|
|
||||||
|
def init():
|
||||||
|
line.set_data([], [])
|
||||||
|
return line,
|
||||||
|
|
||||||
|
|
||||||
|
# print(imax)
|
||||||
|
def update_progress(progress):
|
||||||
|
sys.stdout.write('\r[{0}{1}] {2}%'.format('#'*int(floor(progress)),' '*int(ceil((100-progress))),progress))
|
||||||
|
|
||||||
|
def animate(i):
|
||||||
|
update_progress(int(round(100*i/imax)))
|
||||||
|
line.set_data(x,p[i])
|
||||||
|
return line,
|
||||||
|
print("Creating animation...")
|
||||||
|
anim = animation.FuncAnimation(fig, animate, init_func=init,
|
||||||
|
frames=imax, interval=20, blit=True)
|
||||||
|
# print("Saving animation...")
|
||||||
|
# anim.save('p.mp4', fps=20, extra_args=['-vcodec', 'libx264'])
|
||||||
|
|
||||||
|
print("Showing animation...")
|
||||||
|
show()
|
||||||
|
|
13
ptime.py
Executable file
13
ptime.py
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
from numpy import *
|
||||||
|
from matplotlib.pyplot import *
|
||||||
|
|
||||||
|
pfile=loadtxt('results/p.dat')
|
||||||
|
gp=300
|
||||||
|
pend=zeros(floor(pfile.shape[0]/gp))
|
||||||
|
for i in range(pend.size):
|
||||||
|
pend[i]=pfile[(i+1)*gp-1,1]
|
||||||
|
|
||||||
|
plot(pend)
|
||||||
|
show()
|
@ -1,54 +0,0 @@
|
|||||||
#include "solution.h"
|
|
||||||
#include "geom.h"
|
|
||||||
#include "tube.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace td{
|
|
||||||
SolutionAtGp::SolutionAtGp() {
|
|
||||||
rho_=gc.rho0();
|
|
||||||
}
|
|
||||||
SolutionInstance::SolutionInstance(d time,int gp):
|
|
||||||
time(time)
|
|
||||||
{
|
|
||||||
TRACE(15,"SolutionInstance::SolutionInstance()");
|
|
||||||
gps.resize(gp);
|
|
||||||
}
|
|
||||||
void SolutionInstance::setrho(d rho) {
|
|
||||||
TRACE(15,"SolutionInstance::setrho()");
|
|
||||||
|
|
||||||
for(auto gp=gps.begin();gp!=gps.end();gp++){
|
|
||||||
gp->set(rho);
|
|
||||||
}
|
|
||||||
} // setrho()
|
|
||||||
int SolutionInstance::safe(const char* dir){
|
|
||||||
TRACE(15,"SolutionInstance::safe()");
|
|
||||||
std::stringstream pfilename,ufilename,rhofilename;
|
|
||||||
pfilename.str(""); ufilename.str(""); rhofilename.str("");
|
|
||||||
pfilename << dir;
|
|
||||||
ufilename << dir;
|
|
||||||
rhofilename << dir;
|
|
||||||
|
|
||||||
pfilename << "/p" << nr << ".dat";
|
|
||||||
ufilename << "/u" << nr << ".dat";
|
|
||||||
rhofilename << "/rho" << nr << ".dat";
|
|
||||||
cout << pfilename.str() << "\n";
|
|
||||||
|
|
||||||
std::ofstream p(pfilename.str());
|
|
||||||
std::ofstream u(ufilename.str());
|
|
||||||
std::ofstream rho(rhofilename.str());
|
|
||||||
|
|
||||||
// Writing results for pressure to file
|
|
||||||
p << "#Pressure data vs gridpoint: t=" << time << "\n";
|
|
||||||
u << "#Velocity data vs gridpoint: t=" << time << "\n";
|
|
||||||
rho << "#Density data vs gridpoint: t=" << time << "\n";
|
|
||||||
for(us j=0;j<gps.size();j++){
|
|
||||||
SolutionAtGp& solgp=get(j);
|
|
||||||
p << j << "\t" <<solgp.p() << "\n";
|
|
||||||
u << j << "\t" <<solgp.u() << "\n";
|
|
||||||
rho << j << "\t" <<solgp.rho() << "\n";
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} // namespace td
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#ifndef _SOLUTION_H_
|
|
||||||
#define _SOLUTION_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include "vtypes.h"
|
|
||||||
#include "geom.h"
|
|
||||||
#include "globalconf.h"
|
|
||||||
|
|
||||||
namespace td{
|
|
||||||
SPOILNAMESPACE
|
|
||||||
|
|
||||||
extern tasystem::Globalconf gc;
|
|
||||||
|
|
||||||
class SolutionAtGp
|
|
||||||
{
|
|
||||||
d rho_,m_=0,rhoE_=0;
|
|
||||||
public:
|
|
||||||
// Dependent variables
|
|
||||||
const d& rho() const {return rho_;}
|
|
||||||
const d& m() const {return m_;} // which is rho*u
|
|
||||||
const d& rhoE() const {return rhoE_;} // which is rho*E
|
|
||||||
// Derived from dependent
|
|
||||||
d u() const {return m()/rho();}
|
|
||||||
d ekin() const {return 0.5*rho()*pow(u(),2);}
|
|
||||||
d estat() const {return rhoE()-ekin();}
|
|
||||||
d p() const {return estat()*(gc.gas.gamma(gc.T0)-1);}
|
|
||||||
|
|
||||||
d Cflux() const {return m();}
|
|
||||||
d Mflux() const {return pow(m(),2)/rho()+p();}
|
|
||||||
d Eflux() const {return (rhoE()+gc.p0/(gc.gas.gamma(gc.T0)-1)+p()+gc.p0)*u();}
|
|
||||||
SolutionAtGp();
|
|
||||||
~SolutionAtGp(){}
|
|
||||||
void set(d rho,d m=0,d rhoE=0){
|
|
||||||
rho_=rho;
|
|
||||||
m_=m;
|
|
||||||
rhoE_=rhoE;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class SolutionInstance{
|
|
||||||
vector<SolutionAtGp> gps;
|
|
||||||
d time=0;
|
|
||||||
int nr=0;
|
|
||||||
public:
|
|
||||||
SolutionInstance(d TimeInstance,int gp);
|
|
||||||
~SolutionInstance(){}
|
|
||||||
d getTime() const {return time;}
|
|
||||||
void setTime(d t) {time=t;}
|
|
||||||
void set(us i,SolutionAtGp& sol){ gps.at(i)=sol;}
|
|
||||||
SolutionAtGp& get(us i){ return gps.at(i); }
|
|
||||||
|
|
||||||
void setrho(d rho);
|
|
||||||
int safe(const char* dir);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace td
|
|
||||||
#endif /* _SOLUTION_H_ */
|
|
||||||
|
|
32
src/solutionatgp.cpp
Normal file
32
src/solutionatgp.cpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#include "solutionatgp.h"
|
||||||
|
#include "globalconf.h"
|
||||||
|
|
||||||
|
|
||||||
|
TRACETHIS
|
||||||
|
|
||||||
|
namespace td{
|
||||||
|
|
||||||
|
extern tasystem::Globalconf gc;
|
||||||
|
|
||||||
|
SolutionAtGp::SolutionAtGp() {
|
||||||
|
rho_=gc.rho0();
|
||||||
|
}
|
||||||
|
d SolutionAtGp::u() const {return m()/rho();}
|
||||||
|
d SolutionAtGp::ekin() const {return 0.5*rho()*pow(u(),2);}
|
||||||
|
d SolutionAtGp::estat() const {return rhoE()-ekin();}
|
||||||
|
d SolutionAtGp::p() const {return estat()*(gc.gas.gamma(gc.T0)-1);}
|
||||||
|
|
||||||
|
d SolutionAtGp::Cflux() const {return m();}
|
||||||
|
d SolutionAtGp::Mflux() const {return pow(m(),2)/rho()+p();}
|
||||||
|
d SolutionAtGp::Eflux() const {return (rhoE()+gc.p0/(gc.gas.gamma(gc.T0)-1)+p()+gc.p0)*u();}
|
||||||
|
|
||||||
|
} // namespace td
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
36
src/solutionatgp.h
Normal file
36
src/solutionatgp.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace td{
|
||||||
|
|
||||||
|
typedef double d;
|
||||||
|
class SolutionAtGp {
|
||||||
|
d rho_,m_=0,rhoE_=0;
|
||||||
|
public:
|
||||||
|
// Dependent variables
|
||||||
|
const d& rho() const {return rho_;}
|
||||||
|
const d& m() const {return m_;} // which is rho*u
|
||||||
|
const d& rhoE() const {return rhoE_;} // which is rho*E
|
||||||
|
// Derived from dependent
|
||||||
|
d u() const;
|
||||||
|
d ekin() const;
|
||||||
|
d estat() const;
|
||||||
|
d p() const;
|
||||||
|
|
||||||
|
d Cflux() const;
|
||||||
|
d Mflux() const;
|
||||||
|
d Eflux() const;
|
||||||
|
SolutionAtGp();
|
||||||
|
~SolutionAtGp(){}
|
||||||
|
void setData(d rho,d m=0,d rhoE=0){
|
||||||
|
rho_=rho;
|
||||||
|
m_=m;
|
||||||
|
rhoE_=rhoE;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace td
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
44
src/solutioninstance.cpp
Normal file
44
src/solutioninstance.cpp
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#include "solutioninstance.h"
|
||||||
|
#include "tube.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace td{
|
||||||
|
|
||||||
|
SolutionInstance::SolutionInstance(int gp)
|
||||||
|
{
|
||||||
|
TRACE(12,"SolutionInstance::SolutionInstance()");
|
||||||
|
gps.resize(gp);
|
||||||
|
}
|
||||||
|
void SolutionInstance::setrho(d rho) {
|
||||||
|
TRACE(15,"SolutionInstance::setrho()");
|
||||||
|
|
||||||
|
for(auto gp=gps.begin();gp!=gps.end();gp++){
|
||||||
|
gp->set(rho);
|
||||||
|
}
|
||||||
|
} // setrho()
|
||||||
|
int SolutionInstance::save(std::ofstream& str,data d){
|
||||||
|
TRACE(15,"SolutionInstance::save()");
|
||||||
|
if(d==data::p)
|
||||||
|
for(us j=0;j<gps.size();j++){
|
||||||
|
SolutionAtGp& solgp=get(j);
|
||||||
|
str << j << "\t" <<solgp.p() << "\n";
|
||||||
|
}
|
||||||
|
else if(d==data::u)
|
||||||
|
for(us j=0;j<gps.size();j++){
|
||||||
|
SolutionAtGp& solgp=get(j);
|
||||||
|
str << j << "\t" <<solgp.u() << "\n";
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace td
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
30
src/solutioninstance.h
Normal file
30
src/solutioninstance.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "solutionatgp.h"
|
||||||
|
#include "globalconf.h"
|
||||||
|
|
||||||
|
namespace td{
|
||||||
|
SPOILNAMESPACE
|
||||||
|
|
||||||
|
enum data{
|
||||||
|
p,u
|
||||||
|
};
|
||||||
|
|
||||||
|
extern tasystem::Globalconf gc;
|
||||||
|
|
||||||
|
class SolutionInstance{
|
||||||
|
vector<SolutionAtGp> gps;
|
||||||
|
d time=0;
|
||||||
|
public:
|
||||||
|
SolutionInstance(int gp);
|
||||||
|
~SolutionInstance(){}
|
||||||
|
d getTime() const {return time;}
|
||||||
|
void setTime(d t) {time=t;}
|
||||||
|
void set(us i,SolutionAtGp& sol){ gps.at(i)=sol;}
|
||||||
|
SolutionAtGp& get(us i){ return gps.at(i); }
|
||||||
|
|
||||||
|
void setrho(d rho);
|
||||||
|
int save(std::ofstream&,data d);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace td
|
||||||
|
|
18
src/tube.cpp
18
src/tube.cpp
@ -12,7 +12,7 @@ namespace td{
|
|||||||
return pleft;
|
return pleft;
|
||||||
|
|
||||||
}
|
}
|
||||||
Tube::Tube(d L,int gp): L(L),gp(gp),sol(SolutionInstance(0,gp)) {
|
Tube::Tube(d L,int gp): L(L),gp(gp),sol(SolutionInstance(gp)) {
|
||||||
TRACE(15,"Tube::Tube()");
|
TRACE(15,"Tube::Tube()");
|
||||||
dx=L/(gp-1);
|
dx=L/(gp-1);
|
||||||
VARTRACE(15,gp);
|
VARTRACE(15,gp);
|
||||||
@ -26,13 +26,11 @@ namespace td{
|
|||||||
d newt=t+dt;
|
d newt=t+dt;
|
||||||
|
|
||||||
// Define new solutioninstance
|
// Define new solutioninstance
|
||||||
SolutionInstance newsol=sol;
|
SolutionInstance newsol(gp);
|
||||||
|
newsol.setTime(newt);
|
||||||
SolutionAtGp newsolgp;
|
SolutionAtGp newsolgp;
|
||||||
d rho,m,rhoE;
|
d rho,m,rhoE;
|
||||||
|
|
||||||
newsol.setTime(newt);
|
|
||||||
|
|
||||||
int i=0;
|
int i=0;
|
||||||
// Left boundary
|
// Left boundary
|
||||||
{
|
{
|
||||||
@ -43,16 +41,13 @@ namespace td{
|
|||||||
d momfluxl=ip0.rho()*pow(ip0.u(),2)+pleft(t);
|
d momfluxl=ip0.rho()*pow(ip0.u(),2)+pleft(t);
|
||||||
m=ip0.m()-la*(ip1.Mflux()-momfluxl);
|
m=ip0.m()-la*(ip1.Mflux()-momfluxl);
|
||||||
rhoE=ip0.rhoE()-la*(ip1.Eflux()-ip0.Eflux());
|
rhoE=ip0.rhoE()-la*(ip1.Eflux()-ip0.Eflux());
|
||||||
// rhoE=ip0.rhoE()-la*(ip1.Eflux()-.rhoE()*ip0.u()-ip0.u()*(gc.p0+pleft(t)));
|
|
||||||
newsolgp.set(rho,m,rhoE);
|
newsolgp.set(rho,m,rhoE);
|
||||||
// cout << "pleft: " << pleft(t) <<"\n";
|
|
||||||
// cout << "pleft: " << newsolgp.p() <<"\n";
|
|
||||||
newsol.set(i,newsolgp);
|
newsol.set(i,newsolgp);
|
||||||
|
|
||||||
} // Leftmost node
|
} // Leftmost node
|
||||||
// TRACE(15,"leftmost done");
|
// TRACE(15,"leftmost done");
|
||||||
// Inner nodes
|
// Inner nodes
|
||||||
for(i=1;i<gp-2;i++){
|
for(i=1;i<gp-1;i++){
|
||||||
SolutionAtGp& im1=sol.get(i-1);
|
SolutionAtGp& im1=sol.get(i-1);
|
||||||
SolutionAtGp& ip1=sol.get(i+1);
|
SolutionAtGp& ip1=sol.get(i+1);
|
||||||
d lambda=dt/(2*dx);
|
d lambda=dt/(2*dx);
|
||||||
@ -65,7 +60,7 @@ namespace td{
|
|||||||
|
|
||||||
} // for over all gridpoints in mid
|
} // for over all gridpoints in mid
|
||||||
{
|
{
|
||||||
i++;
|
i=gp-1;
|
||||||
SolutionAtGp& im1=sol.get(i-1);
|
SolutionAtGp& im1=sol.get(i-1);
|
||||||
SolutionAtGp& ip0=sol.get(i);
|
SolutionAtGp& ip0=sol.get(i);
|
||||||
|
|
||||||
@ -83,7 +78,4 @@ namespace td{
|
|||||||
t=newt;
|
t=newt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
10
src/tube.h
10
src/tube.h
@ -2,15 +2,14 @@
|
|||||||
#ifndef _TUBE_H_
|
#ifndef _TUBE_H_
|
||||||
#define _TUBE_H_
|
#define _TUBE_H_
|
||||||
|
|
||||||
#include "geom.h"
|
#include "solutioninstance.h"
|
||||||
#include "globalconf.h"
|
|
||||||
#include "solution.h"
|
|
||||||
|
|
||||||
|
|
||||||
namespace td{
|
namespace td{
|
||||||
|
|
||||||
extern tasystem::Globalconf gc;
|
extern tasystem::Globalconf gc;
|
||||||
|
|
||||||
|
typedef double d;
|
||||||
|
|
||||||
class Tube{
|
class Tube{
|
||||||
d dx,L; // Grid spacing, total length
|
d dx,L; // Grid spacing, total length
|
||||||
int gp; // Number of gridpoints
|
int gp; // Number of gridpoints
|
||||||
@ -19,7 +18,8 @@ namespace td{
|
|||||||
d pleft(d t); // Compute pressure bc
|
d pleft(d t); // Compute pressure bc
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Tube(d L,int gp);
|
Tube(double L,int gp);
|
||||||
|
~Tube(){}
|
||||||
SolutionInstance& getSol() { return sol;}
|
SolutionInstance& getSol() { return sol;}
|
||||||
void setSol(const SolutionInstance& sol) {this->sol=sol;}
|
void setSol(const SolutionInstance& sol) {this->sol=sol;}
|
||||||
void DoIntegration(d dt);
|
void DoIntegration(d dt);
|
||||||
|
@ -1,73 +0,0 @@
|
|||||||
#include "tube.h"
|
|
||||||
#include "tracer.h"
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <boost/program_options.hpp>
|
|
||||||
TRACETHIS;
|
|
||||||
|
|
||||||
using geom::Geom;
|
|
||||||
using geom::Grid;
|
|
||||||
namespace po = boost::program_options;
|
|
||||||
using namespace td;
|
|
||||||
SPOILNAMESPACE;
|
|
||||||
|
|
||||||
// Directory for storage
|
|
||||||
const char* dir="results";
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inline double min(d x,d y){return x<y?x:y;}
|
|
||||||
|
|
||||||
int main(int argc,char *argv[]){
|
|
||||||
|
|
||||||
d f=100;
|
|
||||||
|
|
||||||
|
|
||||||
po::options_description desc("Allowed options");
|
|
||||||
desc.add_options()
|
|
||||||
("help", "Produce help message")
|
|
||||||
("frequency",po::value<d>(&f)->default_value(100))
|
|
||||||
;
|
|
||||||
d T=1/f;
|
|
||||||
d L=0.01;
|
|
||||||
us gp=10;
|
|
||||||
|
|
||||||
d dx=L/gp;
|
|
||||||
d CFL=0.5;
|
|
||||||
// This is questionable
|
|
||||||
d dt=min(CFL*dx/gc.c0(),T/50);
|
|
||||||
cout << "dt:" << dt <<"\n";
|
|
||||||
cout << "dx:" << dx <<"\n";
|
|
||||||
|
|
||||||
td::gc=tasystem::Globalconf::airSTP(0,f,1);
|
|
||||||
cout << "omg:" << td::gc.getomg() << endl;
|
|
||||||
inittrace(15);
|
|
||||||
initothertrace(10,nltracer);
|
|
||||||
|
|
||||||
|
|
||||||
// Create results dir, put all stuff in
|
|
||||||
mkdir(dir,S_IRWXU | S_IRWXG);
|
|
||||||
// Empty this directory
|
|
||||||
system("rm results/*");
|
|
||||||
|
|
||||||
td::Tube t(L,gp);
|
|
||||||
|
|
||||||
|
|
||||||
int nsaves_per_period=50;
|
|
||||||
int nr=0;
|
|
||||||
d time=0;
|
|
||||||
|
|
||||||
while(time<2*T){
|
|
||||||
t.DoIntegration(dt);
|
|
||||||
time=t.getTime();
|
|
||||||
// cout << "Iteration done. Saving data...\n";
|
|
||||||
if(true){
|
|
||||||
// Create filename to store data to
|
|
||||||
} // ti%10
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
52
timedomain.i
Normal file
52
timedomain.i
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
%module timedomaineuler
|
||||||
|
%{
|
||||||
|
#include "solutionatgp.h"
|
||||||
|
#include "test.h"
|
||||||
|
#include "tube.h"
|
||||||
|
%}
|
||||||
|
|
||||||
|
typedef double d;
|
||||||
|
|
||||||
|
namespace td{
|
||||||
|
class SolutionAtGp {
|
||||||
|
d rho_,m_=0,rhoE_=0;
|
||||||
|
public:
|
||||||
|
// Dependent variables
|
||||||
|
const d& rho() const;
|
||||||
|
const d& m() const;
|
||||||
|
const d& rhoE() const;
|
||||||
|
// Derived from dependent
|
||||||
|
d u() const;
|
||||||
|
d ekin() const;
|
||||||
|
d estat() const;
|
||||||
|
d p() const;
|
||||||
|
|
||||||
|
d Cflux() const;
|
||||||
|
d Mflux() const;
|
||||||
|
d Eflux() const;
|
||||||
|
SolutionAtGp();
|
||||||
|
~SolutionAtGp(){}
|
||||||
|
void setData(d rho,d m=0,d rhoE=0);
|
||||||
|
};
|
||||||
|
class SolutionInstance{
|
||||||
|
public:
|
||||||
|
SolutionInstance(int gp);
|
||||||
|
~SolutionInstance(){}
|
||||||
|
d getTime() const;
|
||||||
|
void setTime(d t);
|
||||||
|
void set(us i,SolutionAtGp& sol);
|
||||||
|
SolutionAtGp& get(us i);
|
||||||
|
void setrho(d rho);
|
||||||
|
};
|
||||||
|
|
||||||
|
class Tube{
|
||||||
|
public:
|
||||||
|
Tube(double L,int gp);
|
||||||
|
~Tube(){}
|
||||||
|
SolutionInstance& getSol() { return sol;}
|
||||||
|
void setSol(const SolutionInstance& sol) {this->sol=sol;}
|
||||||
|
void DoIntegration(d dt);
|
||||||
|
d getTime(){return t;}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user