00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef INC_PASOFCT
00016 #define INC_PASOFCT
00017
00018 #include "Functions.h"
00019 #include "Transport.h"
00020
00021
00022 typedef struct Paso_FCTSolver {
00023 Paso_TransportProblem* transportproblem;
00024 Paso_SystemMatrix *flux_matrix_m;
00025 double dt;
00026 double* uTilde_n;
00027 double* QN_n;
00028 double* QP_n;
00029 double* RN_m;
00030 double* RP_m;
00031 Paso_Coupler *QN_n_coupler;
00032 Paso_Coupler *QP_n_coupler;
00033 Paso_Coupler *RN_m_coupler;
00034 Paso_Coupler *RP_m_coupler;
00035 Paso_Coupler *uTilde_n_coupler;
00036 Paso_Coupler *u_m_coupler;
00037 } Paso_FCTSolver;
00038
00039
00040 PASO_DLL_API
00041 err_t Paso_FCTSolver_Function_call(Paso_Function * F,double* value, const double* arg, Paso_Performance *pp);
00042
00043 PASO_DLL_API
00044 void Paso_FCTSolver_Function_free(Paso_Function * in);
00045
00046 PASO_DLL_API
00047 Paso_Function* Paso_FCTSolver_Function_alloc(Paso_TransportProblem *tp, Paso_Options* options);
00048
00049 PASO_DLL_API
00050 err_t Paso_FCTSolver_solve(Paso_Function* F, double* u, double dt, Paso_Options* options, Paso_Performance *pp);
00051
00052 PASO_DLL_API
00053 double Paso_FCTSolver_getSafeTimeStepSize(Paso_TransportProblem* fctp);
00054
00055 PASO_DLL_API
00056 void Paso_FCTSolver_applyPreAntiDiffusionCorrection(Paso_SystemMatrix *f,const Paso_Coupler* u_coupler);
00057
00058 PASO_DLL_API
00059 void Paso_FCTSolver_setQs(const Paso_Coupler* u_coupler,double* QN, double* QP, const Paso_SystemMatrix *L);
00060
00061 PASO_DLL_API
00062 void Paso_FCTSolver_setAntiDiffusionFlux(const double dt, const Paso_TransportProblem * fc, Paso_SystemMatrix *flux_matrix, const Paso_Coupler* u_coupler);
00063
00064 PASO_DLL_API
00065 void Paso_FCTSolver_setRs(const Paso_SystemMatrix *f,const double* lumped_mass_matrix,const Paso_Coupler* QN,const Paso_Coupler* QP,double* RN,double* RP);
00066
00067 PASO_DLL_API
00068 void Paso_FCTSolver_addCorrectedFluxes(double* f,const Paso_SystemMatrix *flux_matrix,const Paso_Coupler* RN,const Paso_Coupler* RP);
00069
00070
00071 PASO_DLL_API
00072 void Paso_FCTSolver_setMuPaLu(double* out, const double* M, const Paso_Coupler* u_coupler, const double a, const Paso_SystemMatrix *L);
00073
00074 PASO_DLL_API
00075 void Paso_FCTSolver_setLowOrderOperator(Paso_TransportProblem * fc);
00076
00077 PASO_DLL_API
00078 void Paso_FCTSolver_setUp(Paso_TransportProblem* fctp, const double dt, const double *u, double* b, double* uTilde,
00079 Paso_Coupler* uTilde_coupler, double *QN, Paso_Coupler* QN_coupler, double *QP, Paso_Coupler* QP_coupler,
00080 Paso_Options* options, Paso_Performance* pp);
00081
00082 PASO_DLL_API
00083 err_t Paso_FCTSolver_setUpRightHandSide(Paso_TransportProblem* fctp, const double dt,
00084 const double *u_m, Paso_Coupler* u_m_coupler, double * z_m,
00085 Paso_SystemMatrix* flux_matrix, Paso_Coupler* uTilde_coupler, const double *b,
00086 Paso_Coupler* QN_coupler, Paso_Coupler* QP_coupler,
00087 double *RN_m, Paso_Coupler* RN_m_coupler, double* RP_m, Paso_Coupler* RP_m_coupler,
00088 Paso_Performance* pp);
00089 PASO_DLL_API
00090 void Paso_FCTSolver_Function_initialize(const double dt3, Paso_TransportProblem* fctp, Paso_Options* options, Paso_Performance* pp);
00091
00092 #endif