00001 #include "cudaktmethod.h"
00002 #include "numericmethods.h"
00003 extern "C" {
00004 void integrate_hyperbolic_code(double m_CFL, double t, double tEnd, double *m_vSol, double *m_vX0, double *m_vX1, double *m_vY0, double *m_vY1, double *m_VZ0, double *m_VZ1, double *m_Vx, double *m_Vy, double *m_Vz);
00005 }
00006
00007
00008 CUDAKTMethod::CUDAKTMethod(OrthoMesh &mesh,Function3D &fInitU,const VecDouble &cPor,Function3D &fPrescribedU,double v1,double v2,double theta,double rs1,double rs2,double CFL)
00009 :m_mesh(mesh)
00010 {
00011
00012
00013 m_vSol.reinit(mesh.numCells(),1);
00014 mesh.setCentralValuesFromFunction(fInitU,m_vSol);
00015 m_vFluxes.reinit(mesh.numFaces());
00016 m_fValues.reinit(mesh.numFaces());
00017 VecIndex vIX0,vIX1,vIY0,vIY1,vIZ0,vIZ1;
00018 m_CFL = CFL;
00019
00020 mesh.getFacesInSlab(mesh.getP()[0],vIX0,0);
00021 mesh.getFacesInSlab(mesh.getQ()[0],vIX1,0);
00022 mesh.getFacesInSlab(mesh.getP()[1],vIY0,1);
00023 mesh.getFacesInSlab(mesh.getQ()[1],vIY1,1);
00024 mesh.getFacesInSlab(mesh.getP()[2],vIZ0,2);
00025 mesh.getFacesInSlab(mesh.getQ()[2],vIZ1,2);
00026
00027 NumericMethods::fillVector(m_fValues,INFINITY);
00028 mesh.setFacesValuesFromFunction(fPrescribedU,m_fValues,0,true);
00029
00030
00031 NumericMethods::getSubVector(m_fValues,vIX0,m_vX0);
00032 NumericMethods::getSubVector(m_fValues,vIX1,m_vX1);
00033 NumericMethods::getSubVector(m_fValues,vIY0,m_vY0);
00034 NumericMethods::getSubVector(m_fValues,vIY1,m_vY1);
00035 NumericMethods::getSubVector(m_fValues,vIZ0,m_vZ0);
00036 NumericMethods::getSubVector(m_fValues,vIZ1,m_vZ1);
00037
00038
00039
00040 m_nX = mesh.numElemX();
00041 m_nY = mesh.numElemY();
00042 m_nZ = mesh.numElemZ();
00043
00044 m_Q = mesh.getQ();
00045
00046 m_rs1=rs1;
00047 m_rs2=rs2;
00048 m_theta=theta;
00049 m_v1 = v1;
00050 m_v2=v2;
00051 m_por = cPor(0);
00052 }
00053
00054
00055 void CUDAKTMethod::updateVelocities(DynamicBase &dynMod)
00056 {
00057
00058 dynMod.getNormalVelocityAtFaces(m_vNV);
00059
00060
00061
00062 m_vX = &(m_vNV(0));
00063 m_vY = m_vX+m_mesh.getFacesInYOffset();
00064 m_vZ = m_vX+m_mesh.getFacesInZOffset();
00065
00066
00067 }
00068
00069 ArrayOfVecDouble& CUDAKTMethod::getSolutionAtCells()
00070 {
00071 return m_vSol;
00072
00073 }
00074
00075
00076 void CUDAKTMethod::printOutput()
00077 {
00078
00079 }
00080
00081
00082 void CUDAKTMethod::updateDataForDynamicModule()
00083 {
00084
00085 }
00086
00087
00088 void CUDAKTMethod::iterateN(unsigned n,double dt)
00089 {
00090 throw new Exception("Cuda not working for now\n");
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 }
00102
00103
00104
00105
00106 double CUDAKTMethod::getDt(double t,double tEnd)
00107 {
00108 return NAN;
00109 throw new Exception("Cuda not working for now\n");
00110
00111 }