Browse Source

dctran.c: synchronization option for shared library

pre-master-46
h_vogt 13 years ago
committed by rlar
parent
commit
a0757d3143
  1. 51
      src/spicelib/analysis/dctran.c

51
src/spicelib/analysis/dctran.c

@ -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…
Cancel
Save