xref: /petsc/src/ts/interface/tscreate.c (revision bdad233f16b1da2fc2320f4673f853efec1db8b6)
1*bdad233fSMatthew Knepley #ifdef PETSC_RCS_HEADER
2*bdad233fSMatthew Knepley static char vcid[] = "$Id: gridcreate.c,v 1.7 2000/01/10 03:54:25 knepley Exp $";
3*bdad233fSMatthew Knepley #endif
4*bdad233fSMatthew Knepley 
5*bdad233fSMatthew Knepley #include "src/grid/gridimpl.h"      /*I "grid.h"  I*/
6*bdad233fSMatthew Knepley 
7*bdad233fSMatthew Knepley #undef __FUNCT__
8*bdad233fSMatthew Knepley #define __FUNCT__ "TSPublish_Petsc"
9*bdad233fSMatthew Knepley static int TSPublish_Petsc(PetscObject obj)
10*bdad233fSMatthew Knepley {
11*bdad233fSMatthew Knepley #if defined(PETSC_HAVE_AMS)
12*bdad233fSMatthew Knepley   TS   v = (TS) obj;
13*bdad233fSMatthew Knepley   int  ierr;
14*bdad233fSMatthew Knepley #endif
15*bdad233fSMatthew Knepley 
16*bdad233fSMatthew Knepley   PetscFunctionBegin;
17*bdad233fSMatthew Knepley 
18*bdad233fSMatthew Knepley #if defined(PETSC_HAVE_AMS)
19*bdad233fSMatthew Knepley   /* if it is already published then return */
20*bdad233fSMatthew Knepley   if (v->amem >=0) PetscFunctionReturn(0);
21*bdad233fSMatthew Knepley 
22*bdad233fSMatthew Knepley   ierr = PetscObjectPublishBaseBegin(obj);CHKERRQ(ierr);
23*bdad233fSMatthew Knepley   ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Step",&v->steps,1,AMS_INT,AMS_READ,
24*bdad233fSMatthew Knepley                                 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
25*bdad233fSMatthew Knepley   ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"Time",&v->ptime,1,AMS_DOUBLE,AMS_READ,
26*bdad233fSMatthew Knepley                                 AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
27*bdad233fSMatthew Knepley   ierr = AMS_Memory_add_field((AMS_Memory)v->amem,"CurrentTimeStep",&v->time_step,1,
28*bdad233fSMatthew Knepley                                AMS_DOUBLE,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
29*bdad233fSMatthew Knepley   ierr = PetscObjectPublishBaseEnd(obj);CHKERRQ(ierr);
30*bdad233fSMatthew Knepley #endif
31*bdad233fSMatthew Knepley   PetscFunctionReturn(0);
32*bdad233fSMatthew Knepley }
33*bdad233fSMatthew Knepley 
34*bdad233fSMatthew Knepley #undef  __FUNCT__
35*bdad233fSMatthew Knepley #define __FUNCT__ "TSCreate"
36*bdad233fSMatthew Knepley /*@
37*bdad233fSMatthew Knepley   TSCreate - This function creates an empty timestepper. The type can then be set with TSSetType().
38*bdad233fSMatthew Knepley 
39*bdad233fSMatthew Knepley   Collective on MPI_Comm
40*bdad233fSMatthew Knepley 
41*bdad233fSMatthew Knepley   Input Parameter:
42*bdad233fSMatthew Knepley . comm - The communicator
43*bdad233fSMatthew Knepley 
44*bdad233fSMatthew Knepley   Output Parameter:
45*bdad233fSMatthew Knepley . ts   - The TS
46*bdad233fSMatthew Knepley 
47*bdad233fSMatthew Knepley   Level: beginner
48*bdad233fSMatthew Knepley 
49*bdad233fSMatthew Knepley .keywords: TS, create
50*bdad233fSMatthew Knepley .seealso: TSSetType(), TSSetUp(), TSDestroy(), MeshCreate()
51*bdad233fSMatthew Knepley @*/
52*bdad233fSMatthew Knepley int TSCreate(MPI_Comm comm, TS *ts) {
53*bdad233fSMatthew Knepley   TS  t;
54*bdad233fSMatthew Knepley   int ierr;
55*bdad233fSMatthew Knepley 
56*bdad233fSMatthew Knepley   PetscFunctionBegin;
57*bdad233fSMatthew Knepley   PetscValidPointer(ts);
58*bdad233fSMatthew Knepley   *ts = PETSC_NULL;
59*bdad233fSMatthew Knepley #ifndef PETSC_USE_DYNAMIC_LIBRARIES
60*bdad233fSMatthew Knepley   ierr = TSInitializePackage(PETSC_NULL);                                                                 CHKERRQ(ierr);
61*bdad233fSMatthew Knepley #endif
62*bdad233fSMatthew Knepley 
63*bdad233fSMatthew Knepley   PetscHeaderCreate(t, _TS, struct _TSOps, TS_COOKIE, -1, "TS", comm, TSDestroy, TSView);
64*bdad233fSMatthew Knepley   PetscLogObjectCreate(t);
65*bdad233fSMatthew Knepley   PetscLogObjectMemory(t, sizeof(struct _TS));
66*bdad233fSMatthew Knepley   ierr = PetscMemzero(t->ops, sizeof(struct _TSOps));                                                     CHKERRQ(ierr);
67*bdad233fSMatthew Knepley   t->bops->publish    = TSPublish_Petsc;
68*bdad233fSMatthew Knepley   t->type_name        = PETSC_NULL;
69*bdad233fSMatthew Knepley   t->serialize_name   = PETSC_NULL;
70*bdad233fSMatthew Knepley 
71*bdad233fSMatthew Knepley   t->ops->applymatrixbc = TSDefaultSystemMatrixBC;
72*bdad233fSMatthew Knepley   t->ops->applyrhsbc    = TSDefaultRhsBC;
73*bdad233fSMatthew Knepley   t->ops->applysolbc    = TSDefaultSolutionBC;
74*bdad233fSMatthew Knepley   t->ops->prestep       = TSDefaultPreStep;
75*bdad233fSMatthew Knepley   t->ops->update        = TSDefaultUpdate;
76*bdad233fSMatthew Knepley   t->ops->poststep      = TSDefaultPostStep;
77*bdad233fSMatthew Knepley 
78*bdad233fSMatthew Knepley   /* General TS description */
79*bdad233fSMatthew Knepley   t->problem_type       = TS_LINEAR;
80*bdad233fSMatthew Knepley   t->vec_sol            = PETSC_NULL;
81*bdad233fSMatthew Knepley   t->vec_sol_always     = PETSC_NULL;
82*bdad233fSMatthew Knepley   t->numbermonitors     = 0;
83*bdad233fSMatthew Knepley   t->isGTS              = PETSC_FALSE;
84*bdad233fSMatthew Knepley   t->isExplicit         = PETSC_NULL;
85*bdad233fSMatthew Knepley   t->Iindex             = PETSC_NULL;
86*bdad233fSMatthew Knepley   t->sles               = PETSC_NULL;
87*bdad233fSMatthew Knepley   t->A                  = PETSC_NULL;
88*bdad233fSMatthew Knepley   t->B                  = PETSC_NULL;
89*bdad233fSMatthew Knepley   t->snes               = PETSC_NULL;
90*bdad233fSMatthew Knepley   t->funP               = PETSC_NULL;
91*bdad233fSMatthew Knepley   t->jacP               = PETSC_NULL;
92*bdad233fSMatthew Knepley   t->setupcalled        = 0;
93*bdad233fSMatthew Knepley   t->data               = PETSC_NULL;
94*bdad233fSMatthew Knepley   t->user               = PETSC_NULL;
95*bdad233fSMatthew Knepley   t->max_steps          = 5000;
96*bdad233fSMatthew Knepley   t->max_time           = 5.0;
97*bdad233fSMatthew Knepley   t->time_step          = .1;
98*bdad233fSMatthew Knepley   t->time_step_old      = t->time_step;
99*bdad233fSMatthew Knepley   t->initial_time_step  = t->time_step;
100*bdad233fSMatthew Knepley   t->steps              = 0;
101*bdad233fSMatthew Knepley   t->ptime              = 0.0;
102*bdad233fSMatthew Knepley   t->linear_its         = 0;
103*bdad233fSMatthew Knepley   t->nonlinear_its      = 0;
104*bdad233fSMatthew Knepley   t->work               = PETSC_NULL;
105*bdad233fSMatthew Knepley   t->nwork              = 0;
106*bdad233fSMatthew Knepley 
107*bdad233fSMatthew Knepley   *ts = t;
108*bdad233fSMatthew Knepley   PetscFunctionReturn(0);
109*bdad233fSMatthew Knepley }
110*bdad233fSMatthew Knepley 
111*bdad233fSMatthew Knepley #undef  __FUNCT__
112*bdad233fSMatthew Knepley #define __FUNCT__ "TSSerialize"
113*bdad233fSMatthew Knepley /*@
114*bdad233fSMatthew Knepley   TSSerialize - This function stores or recreates a timestepper using a viewer for a binary file.
115*bdad233fSMatthew Knepley 
116*bdad233fSMatthew Knepley   Collective on MPI_Comm
117*bdad233fSMatthew Knepley 
118*bdad233fSMatthew Knepley   Input Parameters:
119*bdad233fSMatthew Knepley + comm   - The communicator for the ts object
120*bdad233fSMatthew Knepley . viewer - The viewer context
121*bdad233fSMatthew Knepley - store  - This flag is PETSC_TRUE is data is being written, otherwise it will be read
122*bdad233fSMatthew Knepley 
123*bdad233fSMatthew Knepley   Output Parameter:
124*bdad233fSMatthew Knepley . ts     - The ts
125*bdad233fSMatthew Knepley 
126*bdad233fSMatthew Knepley   Level: beginner
127*bdad233fSMatthew Knepley 
128*bdad233fSMatthew Knepley .keywords: TS, serialize
129*bdad233fSMatthew Knepley .seealso: PartitionSerialize(), TSSerialize()
130*bdad233fSMatthew Knepley @*/
131*bdad233fSMatthew Knepley int TSSerialize(MPI_Comm comm, TS *ts, PetscViewer viewer, PetscTruth store)
132*bdad233fSMatthew Knepley {
133*bdad233fSMatthew Knepley   int      (*serialize)(MPI_Comm, TS *, PetscViewer, PetscTruth);
134*bdad233fSMatthew Knepley   int        fd, cookie, len;
135*bdad233fSMatthew Knepley   char      *name;
136*bdad233fSMatthew Knepley   PetscTruth match;
137*bdad233fSMatthew Knepley   int        ierr;
138*bdad233fSMatthew Knepley 
139*bdad233fSMatthew Knepley   PetscFunctionBegin;
140*bdad233fSMatthew Knepley   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_COOKIE);
141*bdad233fSMatthew Knepley   PetscValidPointer(ts);
142*bdad233fSMatthew Knepley 
143*bdad233fSMatthew Knepley   ierr = PetscTypeCompare((PetscObject) viewer, PETSC_VIEWER_BINARY, &match);                             CHKERRQ(ierr);
144*bdad233fSMatthew Knepley   if (match == PETSC_FALSE) SETERRQ(PETSC_ERR_ARG_WRONG, "Must be binary viewer");
145*bdad233fSMatthew Knepley   ierr = PetscViewerBinaryGetDescriptor(viewer, &fd);                                                     CHKERRQ(ierr);
146*bdad233fSMatthew Knepley 
147*bdad233fSMatthew Knepley   if (!TSSerializeRegisterAllCalled) {
148*bdad233fSMatthew Knepley     ierr = TSSerializeRegisterAll(PETSC_NULL);                                                            CHKERRQ(ierr);
149*bdad233fSMatthew Knepley   }
150*bdad233fSMatthew Knepley   if (!TSSerializeList) SETERRQ(PETSC_ERR_ARG_CORRUPT, "Could not find table of methods");
151*bdad233fSMatthew Knepley 
152*bdad233fSMatthew Knepley   if (store) {
153*bdad233fSMatthew Knepley     PetscValidHeaderSpecific(*ts, TS_COOKIE);
154*bdad233fSMatthew Knepley     ierr = PetscBinaryWrite(fd, &(*ts)->cookie,         1,   PETSC_INT,  0);                              CHKERRQ(ierr);
155*bdad233fSMatthew Knepley     ierr = PetscStrlen((*ts)->serialize_name, &len);                                                      CHKERRQ(ierr);
156*bdad233fSMatthew Knepley     ierr = PetscBinaryWrite(fd, &len,                     1,   PETSC_INT,  0);                            CHKERRQ(ierr);
157*bdad233fSMatthew Knepley     ierr = PetscBinaryWrite(fd,  (*ts)->serialize_name, len, PETSC_CHAR, 0);                              CHKERRQ(ierr);
158*bdad233fSMatthew Knepley     ierr = PetscFListFind(comm, TSSerializeList, (*ts)->serialize_name, (void (**)(void)) &serialize);    CHKERRQ(ierr);
159*bdad233fSMatthew Knepley     if (!serialize) SETERRQ(PETSC_ERR_ARG_WRONG, "Type cannot be serialized");
160*bdad233fSMatthew Knepley     ierr = (*serialize)(comm, ts, viewer, store);                                                         CHKERRQ(ierr);
161*bdad233fSMatthew Knepley   } else {
162*bdad233fSMatthew Knepley     ierr = PetscBinaryRead(fd, &cookie, 1,   PETSC_INT);                                                  CHKERRQ(ierr);
163*bdad233fSMatthew Knepley     if (cookie != TS_COOKIE) SETERRQ(PETSC_ERR_ARG_WRONG, "Non-ts object");
164*bdad233fSMatthew Knepley     /* Dispatch to the correct routine */
165*bdad233fSMatthew Knepley     ierr = PetscBinaryRead(fd, &len,    1,   PETSC_INT);                                                  CHKERRQ(ierr);
166*bdad233fSMatthew Knepley     ierr = PetscMalloc((len+1) * sizeof(char), &name);                                                    CHKERRQ(ierr);
167*bdad233fSMatthew Knepley     name[len] = 0;
168*bdad233fSMatthew Knepley     ierr = PetscBinaryRead(fd,  name,   len, PETSC_CHAR);                                                 CHKERRQ(ierr);
169*bdad233fSMatthew Knepley     ierr = PetscFListFind(comm, TSSerializeList, name, (void (**)(void)) &serialize);                     CHKERRQ(ierr);
170*bdad233fSMatthew Knepley     if (!serialize) SETERRQ(PETSC_ERR_ARG_WRONG, "Type cannot be serialized");
171*bdad233fSMatthew Knepley     ierr = (*serialize)(comm, ts, viewer, store);                                                         CHKERRQ(ierr);
172*bdad233fSMatthew Knepley     ierr = PetscStrfree((*ts)->serialize_name);                                                           CHKERRQ(ierr);
173*bdad233fSMatthew Knepley     (*ts)->serialize_name = name;
174*bdad233fSMatthew Knepley   }
175*bdad233fSMatthew Knepley 
176*bdad233fSMatthew Knepley   PetscFunctionReturn(0);
177*bdad233fSMatthew Knepley }
178