00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef INC_SOLVERFCT
00016 #define INC_SOLVERFCT
00017
00018 #define DT_FACTOR_MAX 1000.
00019
00020 #include "SystemMatrix.h"
00021 #include "Options.h"
00022 #include "performance.h"
00023
00024 typedef struct Paso_FCTransportProblem {
00025
00026 double theta;
00027 double dt_max;
00028 bool_t valid_matrices;
00029 double dt_factor;
00030
00031 Paso_SystemMatrix * transport_matrix;
00032 Paso_SystemMatrix * mass_matrix;
00033
00034 double constraint_factor;
00035 double* constraint_weights;
00036
00037 double* u;
00038 Paso_Coupler* u_coupler;
00039
00040 index_t *main_iptr;
00041 Paso_SystemMatrix * iteration_matrix;
00042 double* main_diagonal_low_order_transport_matrix;
00043 double* lumped_mass_matrix;
00044
00045 Paso_MPIInfo *mpi_info;
00046 dim_t reference_counter;
00047
00048 } Paso_FCTransportProblem;
00049
00050
00051
00052 PASO_DLL_API
00053 Paso_FCTransportProblem* Paso_FCTransportProblem_getReference(Paso_FCTransportProblem* in);
00054
00055 PASO_DLL_API
00056 Paso_FCTransportProblem* Paso_FCTransportProblem_alloc(double theta, Paso_SystemMatrixPattern *pattern, int block_size);
00057
00058 PASO_DLL_API
00059 dim_t Paso_FCTransportProblem_getBlockSize(const Paso_FCTransportProblem* in);
00060
00061 PASO_DLL_API
00062 double Paso_FCTransportProblem_getSafeTimeStepSize(Paso_FCTransportProblem* in);
00063
00064 PASO_DLL_API
00065 void Paso_FCTransportProblem_setLowOrderOperator(Paso_FCTransportProblem * fc);
00066
00067 PASO_DLL_API
00068 Paso_SystemMatrix* Paso_FCTransportProblem_borrowTransportMatrix(Paso_FCTransportProblem* in);
00069
00070 PASO_DLL_API
00071 Paso_SystemMatrix* Paso_FCTransportProblem_borrowMassMatrix(Paso_FCTransportProblem* in);
00072
00073 PASO_DLL_API
00074 double* Paso_FCTransportProblem_borrowLumpedMassMatrix(Paso_FCTransportProblem* in);
00075
00076 PASO_DLL_API
00077 dim_t Paso_FCTransportProblem_getTotalNumRows(Paso_FCTransportProblem* in);
00078
00079 PASO_DLL_API
00080 void Paso_FCTransportProblem_free(Paso_FCTransportProblem* in);
00081
00082 PASO_DLL_API
00083 void Paso_FCTransportProblem_reset(Paso_FCTransportProblem* in);
00084
00085 PASO_DLL_API
00086 void Paso_SolverFCT_solve(Paso_FCTransportProblem* fctp, double* u, double dt, double* source, Paso_Options* options);
00087
00088 PASO_DLL_API
00089 void Paso_FCTransportProblem_checkinSolution(Paso_FCTransportProblem* in, double* u);
00090
00091 PASO_DLL_API
00092 void Paso_FCTransportProblem_applyPreAntiDiffusionCorrection(Paso_SystemMatrix *f,const Paso_Coupler* u_coupler);
00093
00094 PASO_DLL_API
00095 void Paso_SolverFCT_setQs(const Paso_Coupler* u_coupler,double* QN, double* QP, const Paso_SystemMatrix *L);
00096
00097 PASO_DLL_API
00098 void Paso_FCTransportProblem_setAntiDiffusionFlux(const double dt, const Paso_FCTransportProblem * fc, Paso_SystemMatrix *flux_matrix, const Paso_Coupler* u_coupler);
00099
00100 PASO_DLL_API
00101 void Paso_FCTransportProblem_setRs(const Paso_SystemMatrix *f,const double* lumped_mass_matrix,const Paso_Coupler* QN,const Paso_Coupler* QP,double* RN,double* RP);
00102
00103 PASO_DLL_API
00104 void Paso_FCTransportProblem_addCorrectedFluxes(double* f,const Paso_SystemMatrix *flux_matrix,const Paso_Coupler* RN,const Paso_Coupler* RP);
00105
00106
00107 PASO_DLL_API
00108 void Paso_SolverFCT_setMuPaLuPbQ(double* out, const double* M, const Paso_Coupler* u_coupler, const double a, const Paso_SystemMatrix *L, const double b, const double* Q);
00109
00110 PASO_DLL_API
00111 Paso_Connector* Paso_FCTransportProblem_borrowConnector(const Paso_FCTransportProblem* in);
00112
00113 PASO_DLL_API
00114 void Paso_FCT_setUp(Paso_FCTransportProblem* fctp, const double dt, const double *sourceN, const double *sourceP, double* b, double* uTilde,
00115 Paso_Coupler* uTilde_coupler, double *QN, Paso_Coupler* QN_coupler, double *QP, Paso_Coupler* QP_coupler,
00116 Paso_Options* options, Paso_Performance* pp);
00117
00118 PASO_DLL_API
00119 index_t Paso_FCTransportProblem_getTypeId(const index_t solver,const index_t preconditioner, const index_t package,const bool_t symmetry, Paso_MPIInfo *mpi_info);
00120
00121
00122 PASO_DLL_API
00123 void Paso_FCTransportProblem_insertConstraint(Paso_FCTransportProblem* fctp, const double* r, double* source);
00124
00125
00126 PASO_DLL_API
00127 void Paso_FCTransportProblem_setUpConstraint(Paso_FCTransportProblem* fctp, const double* q, const double factor);
00128
00129 #endif