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

📄 basic.c

📁 circuit calculation program
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>

#include "component.h"
#include "eq.h"
#include "drive.h"

static int resistor_init (comp_t *comp, void *f);
        /* volatge between pins,return constant item      */
static VA_value_t resistor_U_eq (struct compinfo *comp,int pin1,int pin2,void * ); 
        /* current eqation entering pin                   */
static VA_value_t resistor_I_eq (struct compinfo *comp,int pin, void * ); 

static int capacitor_init (comp_t *comp, void *f);
        /* volatge between pins,return constant item      */
static VA_value_t capacitor_U_eq (struct compinfo *comp,int pin1,int pin2,void * ); 
        /* current eqation entering pin                   */
static VA_value_t capacitor_I_eq (struct compinfo *comp,int pin, void * ); 

static int inductor_init (comp_t *comp, void *f);
        /* volatge between pins,return constant item      */
static VA_value_t inductor_U_eq (struct compinfo *comp,int pin1,int pin2,void * ); 
        /* current eqation entering pin                   */
static VA_value_t inductor_I_eq (struct compinfo *comp,int pin, void * ); 

        /* current eqation entering pin                   */
static VA_value_t basic_I_eq (struct compinfo *comp,int pin, void * ); 
	/* map a digit  named pin                         */
static int basic_pin_gid (struct compinfo *comp,int pin);
	/* enumerate pins belong to a same network        */
static int basic_sibling_first (struct compinfo *comp, int pin );
static int basic_sibling_next (struct compinfo *comp, int pin, int last );

	/* whether voltage eq applicable between two pins    */
static int basic_voltage_eq_ok (struct compinfo *comp, int pin1, int pin2 );

typedef struct resistor_state_def {
	float_t r;
} resistor_state_t;

typedef struct capacitor_state_def {
	float_t c;
	VA_value_t i;	
	VA_value_t Q;  /* U=Q/C */
} capacitor_state_t;

typedef struct inductor_state_def {
	float_t l;
	VA_value_t i;	
} inductor_state_t;

compclass_t resistor  = {"Resistor", resistor_init, NULL,basic_pin_gid, 
		                resistor_U_eq, basic_I_eq, NULL,1,2, sizeof (resistor_state_t),
		                basic_sibling_first, basic_sibling_next,NULL };
compclass_t capacitor = {"Capacitor",capacitor_init,NULL,basic_pin_gid, 
				capacitor_U_eq,basic_I_eq, NULL,1,2, sizeof (capacitor_state_t),
		                basic_sibling_first, basic_sibling_next,NULL };
compclass_t inductor  = {"Inductor", inductor_init, NULL,basic_pin_gid, 
				inductor_U_eq, basic_I_eq, NULL,1,2, sizeof (inductor_state_t),
		                basic_sibling_first, basic_sibling_next,NULL };

///////////////////////////////resisitor/////////////////////////////	
int resistor_init (comp_t *comp, void *f)
{
	((resistor_state_t *)(comp+1))->r = *(float_t *)f ;
	return 1;
}
        /* volatge between pins,return constant item      */
VA_value_t resistor_U_eq (struct compinfo *comp,int pin_gid1,int pin_gid2,void *e )
{
	float_t r = ((resistor_state_t *)(comp+1))->r;
	
	((EQ_item_t *)e)->var_index = comp->vars_start;
	((EQ_item_t *)e)->coef = (pin_gid1 == comp->pins_start) ? r : -r;
	((EQ_item_t *)e)->next = NULL;
	return 0;
}

        /* current eqation entering pin                   */
//VA_value_t resistor_I_eq (struct compinfo *comp,int pin, void *e )
//{
//	((EQ_item_t *)e)->var_index = comp->vars_start;
//	((EQ_item_t *)e)->coef = (pin == comp->pins_start) ? 1 : -1;
//	((EQ_item_t *)e)->next = NULL;	
//	return 0;	
//}

///////////////////////////////capacitor/////////////////////////////
int capacitor_init (comp_t *comp, void *f)
{
	((capacitor_state_t *)(comp+1))->c = *(float_t *)f ;
	((capacitor_state_t *)(comp+1))->i =
	((capacitor_state_t *)(comp+1))->Q = 0;
	return 1;	
}
        /* volatge between pins,return constant item      */
        /* C U = Q,   Q = i * t                           */ 
VA_value_t capacitor_U_eq (struct compinfo *comp,int pin_gid1,int pin_gid2,void *e )
{
	VA_value_t u;
	
	((EQ_item_t *)e)->next = (EQ_item_t *)-1;
			
	u =((capacitor_state_t *)(comp+1))->Q /
	   ((capacitor_state_t *)(comp+1))->c;
	return pin_gid1 = comp->pins_start ? u : -u;
}
        /* current eqation entering pin                   */
//VA_value_t capacitor_I_eq (struct compinfo *comp,int pin, void *e )
//{
//	return 0;
//}
///////////////////////////////inductor/////////////////////////////
int inductor_init (comp_t *comp, void *f)
{
	((inductor_state_t *)(comp+1))->l = *(float_t *)f ;	
	((inductor_state_t *)(comp+1))->i = 0;
	return 1;
}
        /* volatge between pins,return constant item      */
        /* L di/dt = U => LIx/dt - Li/dt = U              */                                  
VA_value_t inductor_U_eq (struct compinfo *comp,int pin_gid1,int pin_gid2,void *e )
{
	VA_value_t u;
	float_t temp = ((inductor_state_t *)(comp+1))->l/delta_time();
	
	((EQ_item_t *)e)->next = (EQ_item_t *)0;
	((EQ_item_t *)e)->coef = (pin_gid1 == comp->pins_start) ? temp : -temp;
	((EQ_item_t *)e)->var_index = comp->vars_start;	
			
	u =((inductor_state_t *)(comp+1))->i * temp;
	return pin_gid1 = comp->pins_start ? -u : u;
}
        /* current eqation entering pin                   */
//VA_value_t inductor_I_eq (struct compinfo *comp,int pin, void *e )
//{
//}
//////////////////////////general/////////////////////////////////
int basic_pin_gid (struct compinfo *comp,int pin)
{ 
	return pin > 1? -1 : comp ? comp->pins_start + pin : -1;
}	

        /* current eqation entering pin                   */
VA_value_t basic_I_eq (struct compinfo *comp,int pin_gid, void *e )
{
	((EQ_item_t *)e)->var_index = comp->vars_start;
	((EQ_item_t *)e)->coef = (pin_gid == comp->pins_start) ? 1 : -1;
	((EQ_item_t *)e)->next = NULL;	
	return 0;	
}

int basic_voltage_eq_ok (struct compinfo *comp, int pin_gid1, int pin_gid2 )
{
	return 1;
}
int basic_sibling_first (struct compinfo *comp, int pin_gid )
{
	int pin = pin_gid - comp->pins_start;
	return comp->pins_start + (pin ^ 1 );  /* 1->0->1 */
}
int basic_sibling_next (struct compinfo *comp, int pin_gid, int last_gid )
{
	return pin_gid;          /* no more */
}

⌨️ 快捷键说明

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