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