vtf-logo

F77InitialCondition.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 // Copyright (C) 2002 Ralf Deiterding
00004 // Brandenburgische Universitaet Cottbus
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

Generated on Fri Aug 24 13:00:50 2007 for AMROC Fluid-solver Framework - by  doxygen 1.4.7