⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cktsens.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 2 页
字号:
			nvalue.rValue = sg->value + delta_var;#ifdef ASDEBUG			DEBUG(1)				printf("New value: %g\n", nvalue.rValue);#endif			sens_setp(sg, ckt, &nvalue);			if (error && error != E_BADPARM)				return error;			spConstMult(delta_Y, -1.0);			for (j = 0; j < size; j++) {				delta_I[j] *= -1.0;				delta_iI[j] *= -1.0;			}#ifdef ASDEBUG			DEBUG(2) {				printf("Effect of negating matrix:\n");				spPrint(delta_Y, 0, 1, 1);				for (j = 0; j < size; j++)					printf("%d: %g, %g\n", j,						delta_I[j], delta_iI[j]);			}#endif			/* XXX swap back to temp states ??   Naw ... */			(void) sens_temp(sg, ckt);#ifdef ASDEBUG			DEBUG(1) {				if (sens_getp(sg, ckt, &value)) {					continue;				}				printf("New value in device: %g\n",					value.rValue);			}#endif			sens_load(sg, ckt, is_dc);#ifdef ASDEBUG			DEBUG(2) {				printf("Effect of changing the parameter:\n");				spPrint(delta_Y, 0, 1, 1);				for (j = 0; j < size; j++)					printf("%d: %g, %g\n", j,						delta_I[j], delta_iI[j]);			}#endif			/* Set the perturbed variable back to it's			 * original value			 */			value.rValue = sg->value;			sens_setp(sg, ckt, &value);			(void) sens_temp(sg, ckt); /* XXX is this necessary? */			/* Back to business . . . */#ifdef ASDEBUG			DEBUG(2)				for (j = 0; j < size; j++)					printf("          E [%d] = %20.15g\n",						j, E[j]);#endif			/* delta_Y E */			spMultiply(delta_Y, delta_I_delta_Y, E,				delta_iI_delta_Y, iE);#ifdef ASDEBUG			DEBUG(2)				for (j = 0; j < size; j++)					printf("delta_Y * E [%d] = %20.15g\n",						j, delta_I_delta_Y[j]);#endif			/* delta_I - delta_Y E */			for (j = 0; j < size; j++) {				delta_I[j] -= delta_I_delta_Y[j];				delta_iI[j] -= delta_iI_delta_Y[j];			}#ifdef ASDEBUG			DEBUG(2) {				printf(">>> Y:\n");				spPrint(Y, 0, 1, 1);				for (j = 0; j < size; j++)					printf("%d: %g, %g\n", j,						delta_I[j], delta_iI[j]);			}#endif			/* Solve; Y already factored */			spSolve(Y, delta_I, delta_I, delta_iI, delta_iI);#ifdef ASDEBUG			DEBUG(2) {				for (j = 1; j < size; j++) {					if (sg->is_instparam)						printf("%d/%s.%s = %g, %g\n",							j,							sg->instance->GENname,						sg->ptable[sg->param].keyword,						delta_I[j], delta_iI[j]);					else						printf("%d/%s:%s = %g, %g\n",							j,							sg->instance->GENname,						sg->ptable[sg->param].keyword,						delta_I[j], delta_iI[j]);				}			}#endif			/* delta_I is now equal to delta_E */			if (is_dc) {				if (sen_info->output_volt)					output_values[n] = delta_I						[sen_info->output_pos->number]						- delta_I						[sen_info->output_neg->number];				else {					output_values[n] = delta_I[branch_eq];				}				output_values[n] /= delta_var;			} else {				if (sen_info->output_volt) {					output_cvalues[n].real = delta_I						[sen_info->output_pos->number]						- delta_I						[sen_info->output_neg->number];					output_cvalues[n].imag = delta_iI						[sen_info->output_pos->number]						- delta_iI						[sen_info->output_neg->number];				} else {					output_cvalues[n].real =						delta_I[branch_eq];					output_cvalues[n].imag =						delta_iI[branch_eq];				}				output_cvalues[n].real /= delta_var;				output_cvalues[n].imag /= delta_var;			}			n += 1;		}		if (is_dc)			nvalue.v.vec.rVec = output_values;		else			nvalue.v.vec.cVec = output_cvalues;		value.rValue = freq;				(*(SPfrontEnd->OUTpData))(sen_data, &value, &nvalue);		freq = inc_freq(freq, sen_info->step_type, step_size);	}	(*SPfrontEnd->OUTendPlot)((void *) sen_data);	if (is_dc) {		FREE(output_values);	/* XXX free various vectors */	} else {		FREE(output_cvalues);	/* XXX free various vectors */	}	spDestroy(delta_Y);	FREE(delta_I);	FREE(delta_iI);	ckt->CKTrhs = E;	ckt->CKTirhs = iE;	ckt->CKTmatrix = Y;	ckt->CKTbypass = bypass;#ifdef notdef	for (j = 0; j <= ckt->CKTmaxOrder + 1; j++) {		if (ckt->CKTstates[j])			FREE(ckt->CKTstates[j]);		ckt->CKTstates[j] = save_states[j];	}#endif#endif	return OK;}doubleinc_freq(double freq, int type, double step_size){	if (type != LINEAR)		freq *= step_size;	else		freq += step_size;	return freq;}doublenext_freq(int type, double freq, double stepsize){	double	s=0;	switch (type) {	case SENS_DC:		s = 0;		break;	case SENS_LINEAR:		s = freq + stepsize;		break;	case SENS_DECADE:	case SENS_OCTAVE:		s = freq * stepsize;		break;	}	return s;}intcount_steps(int type, double low, double high, int steps, double *stepsize){	double	s;	int	n;	if (steps < 1)		steps = 1;	switch (type) {	default:	case SENS_DC:		n = 0;		s = 0;		break;	case SENS_LINEAR:		n = steps;		s = (high - low) / steps;		break;	case SENS_DECADE:		if (low <= 0.0)			low = 1e-3;		if (high <= low)			high = 10.0 * low;		n = steps * log10(high/low) + 1.01;		s = pow(10.0, 1.0 / steps);		break;	case SENS_OCTAVE:		if (low <= 0.0)			low = 1e-3;		if (high <= low)			high = 2.0 * low;		n = steps * log(high/low) / M_LOG2E + 1.01;		s = pow(2.0, 1.0 / steps);		break;	}	if (n <= 0)		n = 1;	*stepsize = s;	return n;}static intsens_load(sgen *sg, CKTcircuit *ckt, int is_dc){	int	(*fn)( );	error = 0;	if (!is_dc)		fn = DEVices[sg->dev]->DEVacLoad;	else		fn = DEVices[sg->dev]->DEVload;	if (fn)		error = (*fn)(sg->model, ckt);	else		return 1;	return error;}static intsens_temp(sgen *sg, CKTcircuit *ckt){	int	(*fn)( );	error = 0;	fn = DEVices[sg->dev]->DEVtemperature;	if (fn)		error = (*fn)(sg->model, ckt);	else		return 1;	return error;}/* Get parameter value */intsens_getp(sgen *sg, CKTcircuit *ckt, IFvalue *val){	int	(*fn)( );	int	pid;	error = 0;	if (sg->is_instparam) {		fn = DEVices[sg->dev]->DEVask;		pid = DEVices[sg->dev]->DEVpublic.instanceParms[sg->param].id;		if (fn)			error = (*fn)(ckt, sg->instance, pid, val, NULL);		else			return 1;	} else {		fn = DEVices[sg->dev]->DEVmodAsk;		pid = DEVices[sg->dev]->DEVpublic.modelParms[sg->param].id;		if (fn)			error = (*fn)(ckt, sg->model, pid, val, NULL);		else			return 1;	}	if (error) {		if (sg->is_instparam)			printf("GET ERROR: %s:%s:%s -> param %s (%d)\n",				DEVices[sg->dev]->DEVpublic.name,				sg->model->GENmodName,				sg->instance->GENname,				sg->ptable[sg->param].keyword, pid);		else			printf("GET ERROR: %s:%s:%s -> mparam %s (%d)\n",				DEVices[sg->dev]->DEVpublic.name,				sg->model->GENmodName,				sg->instance->GENname,				sg->ptable[sg->param].keyword, pid);	}	return error;}/* Get parameter value */intsens_setp(sgen *sg, CKTcircuit *ckt, IFvalue *val){	int	(*fn)( );	int	pid;	error = 0;	if (sg->is_instparam) {		fn = DEVices[sg->dev]->DEVparam;		pid = DEVices[sg->dev]->DEVpublic.instanceParms[sg->param].id;		if (fn)			error = (*fn)(pid, val, sg->instance, NULL);		else			return 1;	} else {		fn = DEVices[sg->dev]->DEVmodParam;		pid = DEVices[sg->dev]->DEVpublic.modelParms[sg->param].id;		if (fn)			error = (*fn)(pid, val, sg->model);		else			return 1;	}	if (error) {		if (sg->is_instparam)			printf("SET ERROR: %s:%s:%s -> param %s (%d)\n",				DEVices[sg->dev]->DEVpublic.name,				sg->model->GENmodName,				sg->instance->GENname,				sg->ptable[sg->param].keyword, pid);		else			printf("SET ERROR: %s:%s:%s -> mparam %s (%d)\n",				DEVices[sg->dev]->DEVpublic.name,				sg->model->GENmodName,				sg->instance->GENname,				sg->ptable[sg->param].keyword, pid);	}	return error;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -