Actual source code: tscreate.c
1: #define PETSCTS_DLL
3: #include private/tsimpl.h
5: #if 0
8: static PetscErrorCode TSPublish_Petsc(PetscObject obj)
9: {
11: return(0);
12: }
13: #endif
15: #undef __FUNCT__
17: /*@C
18: TSCreate - This function creates an empty timestepper. The problem type can then be set with TSSetProblemType() and the
19: type of solver can then be set with TSSetType().
21: Collective on MPI_Comm
23: Input Parameter:
24: . comm - The communicator
26: Output Parameter:
27: . ts - The TS
29: Level: beginner
31: .keywords: TS, create
32: .seealso: TSSetType(), TSSetUp(), TSDestroy(), MeshCreate(), TSSetProblemType()
33: @*/
34: PetscErrorCode TSCreate(MPI_Comm comm, TS *ts) {
35: TS t;
40: *ts = PETSC_NULL;
41: #ifndef PETSC_USE_DYNAMIC_LIBRARIES
42: TSInitializePackage(PETSC_NULL);
43: #endif
45: PetscHeaderCreate(t, _p_TS, struct _TSOps, TS_COOKIE, -1, "TS", comm, TSDestroy, TSView);
46: PetscMemzero(t->ops, sizeof(struct _TSOps));
48: t->ops->prestep = TSDefaultPreStep;
49: t->ops->poststep = TSDefaultPostStep;
51: /* General TS description */
52: t->problem_type = TS_LINEAR;
53: t->vec_sol = PETSC_NULL;
54: t->vec_sol_always = PETSC_NULL;
55: t->numbermonitors = 0;
56: t->ksp = PETSC_NULL;
57: t->A = PETSC_NULL;
58: t->B = PETSC_NULL;
59: t->Arhs = PETSC_NULL;
60: t->Alhs = PETSC_NULL;
61: t->matflg = DIFFERENT_NONZERO_PATTERN;
62: t->snes = PETSC_NULL;
63: t->funP = PETSC_NULL;
64: t->jacP = PETSC_NULL;
65: t->setupcalled = 0;
66: t->data = PETSC_NULL;
67: t->user = PETSC_NULL;
68: t->max_steps = 5000;
69: t->max_time = 5.0;
70: t->time_step = .1;
71: t->time_step_old = t->time_step;
72: t->initial_time_step = t->time_step;
73: t->steps = 0;
74: t->ptime = 0.0;
75: t->linear_its = 0;
76: t->nonlinear_its = 0;
77: t->work = PETSC_NULL;
78: t->nwork = 0;
80: *ts = t;
81: return(0);
82: }
84: /* Set A = 1/dt*Alhs - A, B = 1/dt*Blhs - B */
87: PetscErrorCode TSScaleShiftMatrices(TS ts,Mat A,Mat B,MatStructure str)
88: {
89: PetscTruth flg;
91: PetscScalar mdt = 1.0/ts->time_step;
94: /* this function requires additional work! */
95: PetscTypeCompare((PetscObject)A,MATMFFD,&flg);
96: if (!flg) {
97: MatScale(A,-1.0);
98: if (ts->Alhs){
99: MatAXPY(A,mdt,ts->Alhs,DIFFERENT_NONZERO_PATTERN);
100: } else {
101: MatShift(A,mdt);
102: }
103: }
104: if (B != A && str != SAME_PRECONDITIONER) {
105: MatScale(B,-1.0);
106: MatShift(B,mdt);
107: }
108: return(0);
109: }