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