dctran.c: synchronization option for shared library
This commit is contained in:
parent
2c97c31658
commit
a0757d3143
|
|
@ -36,6 +36,9 @@ extern struct dbcomm *dbs;
|
|||
|
||||
#ifdef SHARED_MODULE
|
||||
extern int add_bkpt(void);
|
||||
extern int sharedsync(double*, double*, double, double, int, int*, int);
|
||||
extern int ng_ident; /* for debugging */
|
||||
static double del_before; /* for debugging */
|
||||
#endif
|
||||
|
||||
#define INIT_STATS() \
|
||||
|
|
@ -102,7 +105,7 @@ DCtran(CKTcircuit *ckt,
|
|||
double ipc_last_delta = 0.0;
|
||||
/* gtri - end - wbk - 12/19/90 - Add IPC stuff */
|
||||
#endif
|
||||
#ifdef CLUSTER
|
||||
#if defined CLUSTER || defined SHARED_MODULE
|
||||
int redostep;
|
||||
#endif
|
||||
if(restart || ckt->CKTtime == 0) {
|
||||
|
|
@ -623,6 +626,12 @@ resume:
|
|||
|
||||
/* gtri - end - wbk - Modify Breakpoint stuff */
|
||||
|
||||
#ifdef SHARED_MODULE
|
||||
/* Either directly go to next time step, or modify ckt->CKTdelta depending on
|
||||
synchronization requirements. sharedsync() returns 0. */
|
||||
sharedsync(&ckt->CKTtime, &ckt->CKTdelta, 0, ckt->CKTfinalTime, 0, &ckt->CKTstat->STATrejected, 0);
|
||||
#endif
|
||||
|
||||
/* gtri - begin - wbk - Do event solution */
|
||||
|
||||
if(ckt->evt->counts.num_insts > 0) {
|
||||
|
|
@ -674,6 +683,13 @@ resume:
|
|||
}
|
||||
#endif /* CLUSTER */
|
||||
|
||||
#ifdef SHARED_MODULE
|
||||
/* Either directly go to next time step, or modify ckt->CKTdelta depending on
|
||||
synchronization requirements. sharedsync() returns 0.
|
||||
*/
|
||||
sharedsync(&ckt->CKTtime, &ckt->CKTdelta, 0, 0, &ckt->CKTstat->STATrejected, 0);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
for(i=5; i>=0; i--)
|
||||
ckt->CKTdeltaOld[i+1] = ckt->CKTdeltaOld[i];
|
||||
|
|
@ -687,7 +703,7 @@ resume:
|
|||
|
||||
/* 600 */
|
||||
for (;;) {
|
||||
#ifdef CLUSTER
|
||||
#if defined CLUSTER || defined SHARED_MODULE
|
||||
redostep = 1;
|
||||
#endif
|
||||
#ifdef XSPICE
|
||||
|
|
@ -766,8 +782,12 @@ resume:
|
|||
|
||||
if(converged != 0) {
|
||||
#ifndef CLUSTER
|
||||
#ifndef SHARED_MODULE
|
||||
ckt->CKTtime = ckt->CKTtime -ckt->CKTdelta;
|
||||
ckt->CKTstat->STATrejected ++;
|
||||
#else
|
||||
redostep = 1;
|
||||
#endif
|
||||
#endif
|
||||
ckt->CKTdelta = ckt->CKTdelta/8;
|
||||
#ifdef STEPDEBUG
|
||||
|
|
@ -814,7 +834,7 @@ resume:
|
|||
}
|
||||
#endif
|
||||
firsttime = 0;
|
||||
#ifndef CLUSTER
|
||||
#if !defined CLUSTER && !defined SHARED_MODULE
|
||||
goto nextTime; /* no check on
|
||||
* first time point
|
||||
*/
|
||||
|
|
@ -877,7 +897,7 @@ resume:
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifndef CLUSTER
|
||||
#if !defined CLUSTER && !defined SHARED_MODULE
|
||||
/* go to 650 - trapezoidal */
|
||||
goto nextTime;
|
||||
#else
|
||||
|
|
@ -886,8 +906,12 @@ resume:
|
|||
#endif
|
||||
} else {
|
||||
#ifndef CLUSTER
|
||||
#ifndef SHARED_MODULE
|
||||
ckt->CKTtime = ckt->CKTtime -ckt->CKTdelta;
|
||||
ckt->CKTstat->STATrejected ++;
|
||||
#else
|
||||
redostep = 1;
|
||||
#endif
|
||||
#endif
|
||||
ckt->CKTdelta = newdelta;
|
||||
#ifdef STEPDEBUG
|
||||
|
|
@ -926,6 +950,25 @@ resume:
|
|||
ckt->CKTstat->STATrejected ++;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SHARED_MODULE
|
||||
/* redostep == 0:
|
||||
Either directly go to next time step, or modify ckt->CKTdelta depending on
|
||||
synchronization requirements. sharedsync() returns 0.
|
||||
redostep == 1:
|
||||
No convergence, or too large truncation error.
|
||||
Redo the last time step by subtracting olddelta, and modify ckt->CKTdelta
|
||||
depending on synchronization requirements. sharedsync() returns 1.
|
||||
User-supplied redo request:
|
||||
sharedsync() may return 1 if the user has decided to do so in the callback
|
||||
function.
|
||||
*/
|
||||
chkStep:
|
||||
if(sharedsync(&ckt->CKTtime, &ckt->CKTdelta, olddelta, ckt->CKTfinalTime, redostep,
|
||||
&ckt->CKTstat->STATrejected, 1) == 0)
|
||||
goto nextTime;
|
||||
#endif
|
||||
|
||||
}
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue