00001
00002
00003
00004
00005
00006 #ifndef AMROC_F77_INITIALCONDITION_H
00007 #define AMROC_F77_INITIALCONDITION_H
00008
00016 #include "InitialCondition.h"
00017
00026 template <class VectorType, int dim>
00027 class F77InitialCondition : public InitialCondition<VectorType,dim> {
00028 typedef typename VectorType::InternalDataType DataType;
00029 typedef InitialCondition<VectorType,dim> base;
00030
00031 public:
00032 typedef typename base::vec_grid_fct_type vec_grid_fct_type;
00033 typedef typename base::vec_grid_data_type vec_grid_data_type;
00034
00035 typedef generic_fortran_func generic_func_type;
00036
00037 typedef void (*init_1_func_type) ( const INTEGER& maxmx,
00038 const INTEGER& meqn, const INTEGER& mbc,
00039 const INTEGER& mx,
00040 const DOUBLE x[],
00041 const DOUBLE& dx,
00042 VectorType q[]);
00043 typedef void (*init_2_func_type) ( const INTEGER& maxmx, const INTEGER& maxmy,
00044 const INTEGER& meqn, const INTEGER& mbc,
00045 const INTEGER& mx, const INTEGER& my,
00046 const DOUBLE x[], const DOUBLE y[],
00047 const DOUBLE& dx, const DOUBLE& dy,
00048 VectorType q[]);
00049 typedef void (*init_3_func_type) ( const INTEGER& maxmx, const INTEGER& maxmy, const INTEGER& maxmz,
00050 const INTEGER& meqn, const INTEGER& mbc,
00051 const INTEGER& mx, const INTEGER& my, const INTEGER& mz,
00052 const DOUBLE x[], const DOUBLE y[], const DOUBLE z[],
00053 const DOUBLE& dx, const DOUBLE& dy, const DOUBLE& dz,
00054 VectorType q[]);
00055
00056 F77InitialCondition() : base(), f_init(0) {}
00057 F77InitialCondition(generic_func_type init) : base(), f_init(init) {}
00058
00059 virtual ~F77InitialCondition() {}
00060
00061 virtual void SetGrid(vec_grid_data_type& gd, const int& level) {
00062 assert(f_init != (generic_func_type) 0);
00063 Coords ex = gd.extents();
00064 DCoords lbcorner = base::GH().worldCoords(gd.lower(), gd.stepsize());
00065 DCoords dx = base::GH().worldStep(gd.stepsize());
00066 int maxm[3], mx[3], d;
00067 DataType* x[3];
00068 for (d=0; d<dim; d++) {
00069 maxm[d] = ex(d);
00070 mx[d] = ex(d)-2*base::NGhosts();
00071 x[d] = new DataType[maxm[d]];
00072 for (int i=0; i<maxm[d]; i++) x[d][i] = (i+0.5)*dx(d)+lbcorner(d);
00073 }
00074
00075 if (dim == 1)
00076 ((init_1_func_type) f_init)(AA(1,mx),base::NEquations(), base::NGhosts(),
00077 AA(1,mx), AA(1,x), AA(1,dx), gd.data());
00078 else if (dim == 2)
00079 ((init_2_func_type) f_init)(AA(2,mx),base::NEquations(), base::NGhosts(),
00080 AA(2,mx), AA(2,x), AA(2,dx), gd.data());
00081 else if (dim == 3)
00082 ((init_3_func_type) f_init)(AA(3,mx),base::NEquations(), base::NGhosts(),
00083 AA(3,mx), AA(3,x), AA(3,dx), gd.data());
00084
00085 for (d=0; d<dim; d++)
00086 delete [] x[d];
00087 }
00088
00089 inline void SetFunc(generic_func_type init) { f_init = init; }
00090 generic_func_type GetFunc() const { return f_init; }
00091
00092 protected:
00093 generic_func_type f_init;
00094 };
00095
00096
00097 #endif