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

📄 cktsens.c

📁 linux平台下类似著名的电路板作图软件 Spice的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
				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;		OUTpData(sen_data, &value, &nvalue);		freq = inc_freq(freq, sen_info->step_type, step_size);	}	(*SPfrontEnd->OUTendPlot)((GENERIC *) 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(freq, type, step_size)	double	freq;	int	type;	double	step_size;{	if (type != LINEAR)		freq *= step_size;	else		freq += step_size;	return freq;}doublenext_freq(type, freq, stepsize)	int	type;	double	freq, stepsize;{	double	s;	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(type, low, high, steps, stepsize)	int	type;	double	low, 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(sg, ckt, is_dc)	CKTcircuit	*ckt;	sgen		*sg;	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(sg, ckt)	CKTcircuit	*ckt;	sgen		*sg;{	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(sg, ckt, val)	CKTcircuit	*ckt;	sgen		*sg;	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 */static intsens_setp(sg, ckt, val)	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 + -