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

📄 plotit.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 2 页
字号:
                ptype = PLOT_POINT;            else {                fprintf(cp_err,                    "Warning: strange plot type %s\n",                    buf);                ptype = PLOT_LIN;            }            pfound = TRUE;        } else            ptype = PLOT_LIN;    }    if (!sameflag || !xlabel)        xlabel = getword(wl, "xlabel");    else        (void) getword(wl, "xlabel");    if (!sameflag || !ylabel)        ylabel = getword(wl, "ylabel");    else        (void) getword(wl, "ylabel");    if (!sameflag || !title)        title = getword(wl, "title");    else        (void) getword(wl, "title");    if (!sameflag)        nointerp = getflag(wl, "nointerp");    else if (getflag(wl, "nointerp"))        nointerp = TRUE;    wl = wl->wl_next;    if(tw) tfree(tw);    if (!wl) {        fprintf(cp_err, "Error: no vectors given\n");        goto quit1;    }    wl->wl_prev = NULL;    /* Now parse the vectors.  We have a list of the form     * "a b vs c d e vs f g h".  Since it's a bit of a hassle for     * us to parse the vector boundaries here, we do this -- call     * ft_getpnames() without the check flag, and then look for 0-length     * vectors with the name "vs"...  This is a sort of a gross hack,     * since we have to check for 0-length vectors ourselves after     * evaulating the pnodes...     */    names = ft_getpnames(wl, FALSE);    if (names == NULL)        goto quit1;    /* Now evaluate the names. */    for (n = names, lv = NULL; n; n = n->pn_next) {        if (n->pn_value && (n->pn_value->v_length == 0) &&                eq(n->pn_value->v_name, "vs")) {            if (!lv) {                fprintf(cp_err, "Error: misplaced vs arg\n");                goto quit;            } else {                if (!(n = n->pn_next)) {                    fprintf(cp_err,                        "Error: missing vs arg\n");                    goto quit;                }                dv = ft_evaluate(n);                if (!dv)                    goto quit;                if (lastvs)                    lv = lastvs->v_link2;                else                    lv = vecs;                while (lv) {                    lv->v_scale = dv;                    lastvs = lv;                    lv = lv->v_link2;                }            }            continue;        }        dv = ft_evaluate(n);        if (!dv)            goto quit;        if (!d)            vecs = dv;        else            d->v_link2 = dv;        for (d = dv; d->v_link2; d = d->v_link2)            ;        lv = dv;    }/*    free_pnode(names); pn:really should be commented out ? */     d->v_link2 = NULL;    /* Now check for 0-length vectors. */    for (d = vecs; d; d = d->v_link2)        if (!d->v_length) {            fprintf(cp_err, "Error: %s: no such vector\n",                    d->v_name);            goto quit;        }        /* If there are higher dimensional vectors, transform them into a     * family of vectors.     */    for (d = vecs, lv = NULL; d; d = d->v_link2) {        if (d->v_numdims > 1) {	    if (lv)		lv->v_link2 = vec_mkfamily(d);	    else		vecs = lv = vec_mkfamily(d);            while (lv->v_link2)                lv = lv->v_link2;            lv->v_link2 = d->v_link2;            d = lv;        } else {            lv = d;	}    }    /* Now fill in the scales for vectors who aren't already fixed up. */    for (d = vecs; d; d = d->v_link2)        if (!d->v_scale) {            if (d->v_plot->pl_scale)                d->v_scale = d->v_plot->pl_scale;            else                d->v_scale = d;        }	/* The following line displays the unit at the time of 	 temp-sweep and res-sweep. This may not be a so good solution. by H.T */	if(!strcmp(vecs->v_scale->v_name,"temp-sweep")) vecs->v_scale->v_type=14;	if(!strcmp(vecs->v_scale->v_name,"res-sweep")) vecs->v_scale->v_type=15;    /* See if the log flag is set anywhere... */    if (!gfound) {        for (d = vecs; d; d = d->v_link2)            if (d->v_scale && (d->v_scale->v_gridtype == GRID_XLOG))                gtype = GRID_XLOG;        for (d = vecs; d; d = d->v_link2)            if (d->v_gridtype == GRID_YLOG) {                if ((gtype == GRID_XLOG) ||                        (gtype == GRID_LOGLOG))                    gtype = GRID_LOGLOG;                else                    gtype = GRID_YLOG;            }        for (d = vecs; d; d = d->v_link2)            if (d->v_gridtype == GRID_SMITH || d->v_gridtype == GRID_SMITHGRID		|| d->v_gridtype == GRID_POLAR)	    {                gtype = d->v_gridtype;                break;            }    }    /* See if there are any default plot types...  Here, like above, we     * don't do entirely the best thing when there is a mixed set of     * default plot types...     */    if (!sameflag && !pfound) {        ptype = PLOT_LIN;        for (d = vecs; d; d = d->v_link2)            if (d->v_plottype != PLOT_LIN) {                ptype = d->v_plottype;                break;            }    }    /* Check and see if this is pole zero stuff. */    if ((vecs->v_type == SV_POLE) || (vecs->v_type == SV_ZERO))        oneval = TRUE;        for (d = vecs; d; d = d->v_link2)        if (((d->v_type == SV_POLE) || (d->v_type == SV_ZERO)) !=                oneval ? 1 : 0) {            fprintf(cp_err,"Error: plot must be either all pole-zero or contain no poles or zeros\n");            goto quit;        }        if ((gtype == GRID_POLAR) || (gtype == GRID_SMITH	|| gtype == GRID_SMITHGRID))    {        oneval = TRUE;    }    /* If we are plotting scalars, make sure there is enough     * data to fit on the screen.     */        for (d = vecs; d; d = d->v_link2)        if (d->v_length == 1)            xtend(d, d->v_scale->v_length);    /* Now patch up each vector with the compression and thestrchr     * selection.     */    if (xcompress || xindices) {        for (d = vecs; d; d = d->v_link2) {            compress(d, xcompress, xindices);            d->v_scale = vec_copy(d->v_scale);            compress(d->v_scale, xcompress, xindices);        }    }        /* Transform for smith plots */    if (gtype == GRID_SMITH) {	double	re, im, rex, imx;	double	r, i, x;	struct dvec **prevvp, *n;	int	j;	prevvp = &vecs;	for (d = vecs; d; d = d->v_link2) {	    if (d->v_flags & VF_PERMANENT) {		n = vec_copy(d);		n->v_flags &= ~VF_PERMANENT;		n->v_link2 = d->v_link2;		d = n;		*prevvp = d;	    }	    prevvp = &d->v_link2;	    if (isreal(d)) {		fprintf(cp_err,		    "Warning: plotting real data \"%s\" on a smith grid\n",		    d->v_name);		for (j = 0; j < d->v_length; j++) {		    r = d->v_realdata[j];		    d->v_realdata[j] = (r - 1) / (r + 1);		}	    } else {		for (j = 0; j < d->v_length; j++) {		    /* (re - 1, im) / (re + 1, im) */		    re = realpart(d->v_compdata + j);		    im = imagpart(d->v_compdata + j);		    rex = re + 1;		    imx = im;		    re = re - 1;		    /* (re, im) / (rex, imx) */		    x = 1 - (imx / rex) * (imx / rex);		    r = re / rex + im / rex * imx / rex;		    i = im / rex - re / rex * imx / rex;		    realpart(d->v_compdata + j) = r / x;		    imagpart(d->v_compdata + j) = i / x;		}	    }	}    }    /* Figure out the proper x- and y-axis limits. */    if (ylim) {	    ylims[0] = ylim[0];	    ylims[1] = ylim[1];    } else if (oneval) {        ylims[0] = HUGE;        ylims[1] = - ylims[0];        for (d = vecs; d; d = d->v_link2) {		dd = ft_minmax(d, TRUE);            if (dd[0] < ylims[0])                ylims[0] = dd[0];            if (dd[1] > ylims[1])                ylims[1] = dd[1];        }    } else {        ylims[0] = HUGE;        ylims[1] = - ylims[0];        for (d = vecs; d; d = d->v_link2) {            dd = ft_minmax(d, TRUE);            if (dd[0] < ylims[0])                ylims[0] = dd[0];            if (dd[1] > ylims[1])                ylims[1] = dd[1];        }	/* XXX */	for (d = vecs; d; d = d->v_link2) {	    if (d->v_flags & VF_MINGIVEN)		if (ylims[0] < d->v_minsignal)		    ylims[0] = d->v_minsignal;	    if (d->v_flags & VF_MAXGIVEN)		if (ylims[1] > d->v_maxsignal)		    ylims[1] = d->v_maxsignal;	}    }    if (xlim) {	    xlims[0] = xlim[0];	    xlims[1] = xlim[1];    } else if (oneval) {        xlims[0] = HUGE;        xlims[1] = - xlims[0];        for (d = vecs; d; d = d->v_link2) {		dd = ft_minmax(d, FALSE);            if (dd[0] < xlims[0])                xlims[0] = dd[0];            if (dd[1] > xlims[1])                xlims[1] = dd[1];        }    } else {        xlims[0] = HUGE;        xlims[1] = - xlims[0];        for (d = vecs; d; d = d->v_link2) {            dd = ft_minmax(d->v_scale, TRUE);            if (dd[0] < xlims[0])                xlims[0] = dd[0];            if (dd[1] > xlims[1])                xlims[1] = dd[1];        }        for (d = vecs; d; d = d->v_link2) {            if (d->v_scale->v_flags & VF_MINGIVEN)                if (xlims[0] < d->v_scale->v_minsignal)                    xlims[0] = d->v_scale->v_minsignal;            if (d->v_scale->v_flags & VF_MAXGIVEN)                if (xlims[1] > d->v_scale->v_maxsignal)                    xlims[1] = d->v_scale->v_maxsignal;        }    }    /* Do some coercion of the limits to make them reasonable. */    if ((xlims[0] == 0) && (xlims[1] == 0)) {        xlims[0] = -1.0;        xlims[1] = 1.0;    }    if ((ylims[0] == 0) && (ylims[1] == 0)) {        ylims[0] = -1.0;        ylims[1] = 1.0;    }    if (xlims[0] > xlims[1]) {        tt = xlims[1];        xlims[1] = xlims[0];        xlims[0] = tt;    }    if (ylims[0] > ylims[1]) {        tt = ylims[1];        ylims[1] = ylims[0];        ylims[0] = tt;    }    if (xlims[0] == xlims[1]) {        xlims[0] *= (xlims[0] > 0) ? 0.9 : 1.1;        xlims[1] *= (xlims[1] > 0) ? 1.1 : 0.9;    }    if (ylims[0] == ylims[1]) {	    /* || fabs(ylims[0])/(ylims[1]-ylims[0]) > 1.0e9	    || fabs(ylims[1])/(ylims[1]-ylims[0]) > 1.0e9) */        ylims[0] *= (ylims[0] > 0) ? 0.9 : 1.1;        ylims[1] *= (ylims[1] > 0) ? 1.1 : 0.9;    }    if ((xlims[0] <= 0.0) && ((gtype == GRID_XLOG) ||            (gtype == GRID_LOGLOG))) {        fprintf(cp_err,             "Error: X values must be > 0 for log scale\n");        goto quit;    }    if ((ylims[0] <= 0.0) && ((gtype == GRID_YLOG) ||            (gtype == GRID_LOGLOG))) {        fprintf(cp_err,             "Error: Y values must be > 0 for log scale\n");        goto quit;    }    /* Fix the plot limits for smith and polar grids. */    if ((!xlim || !ylim) && (gtype == GRID_POLAR)) {        /* (0,0) must be in the center of the screen. */        mx = (fabs(xlims[0]) > fabs(xlims[1])) ? fabs(xlims[0]) :                fabs(xlims[1]);        my = (fabs(ylims[0]) > fabs(ylims[1])) ? fabs(ylims[0]) :                fabs(ylims[1]);        rad = (mx > my) ? mx : my;        /* rad = sqrt(mx * mx + my * my); */        xlims[0] = - rad;        xlims[1] = rad;        ylims[0] = - rad;        ylims[1] = rad;    } else if ((!xlim || !ylim) && (gtype == GRID_SMITH        || gtype == GRID_SMITHGRID))    {        xlims[0] = -1.0;        xlims[1] = 1.0;        ylims[0] = -1.0;        ylims[1] = 1.0;    }    /* We don't want to try to deal with smith plots for asciiplot. */    if (devname && eq(devname, "lpr")) {        /* check if we should (can) linearize */        if (!(!ft_curckt || !ft_curckt->ci_ckt ||            strcmp(ft_curckt->ci_name, plot_cur->pl_title) ||            !if_tranparams(ft_curckt, &tstart, &tstop, &tstep) ||            ((tstop - tstart) * tstep <= 0.0) ||            ((tstop - tstart) < tstep) ||            !plot_cur || !plot_cur->pl_dvecs ||            !plot_cur->pl_scale ||            !isreal(plot_cur->pl_scale) ||            !ciprefix("tran", plot_cur->pl_typename))) {          newlen = (tstop - tstart) / tstep + 1.5;          newscale = (double *) tmalloc(newlen * sizeof(double));          newv_scale = alloc(struct dvec);          newv_scale->v_flags = vecs->v_scale->v_flags;          newv_scale->v_type = vecs->v_scale->v_type;          newv_scale->v_gridtype = vecs->v_scale->v_gridtype;          newv_scale->v_length = newlen;          newv_scale->v_name = copy(vecs->v_scale->v_name);          newv_scale->v_realdata = newscale;          for (i = 0, ttime = tstart; i < newlen; i++, ttime += tstep)            newscale[i] = ttime;          for (v = vecs; v; v= v->v_link2) {            newdata = (double *) tmalloc(newlen * sizeof (double));            if (!ft_interpolate(v->v_realdata, newdata,                v->v_scale->v_realdata, v->v_scale->v_length,            newscale, newlen, 1)) {            fprintf(cp_err,                "Error: can't interpolate %s\n", v->v_name);            goto quit;            }            tfree(v->v_realdata);            v->v_realdata = newdata;            /* Why go to all this trouble if agraf ignores it? */            nointerp = TRUE;          }          vecs->v_scale = newv_scale;        }        ft_agraf(xlims, ylims, vecs->v_scale, vecs->v_plot, vecs,             xdelta ? *xdelta : 0.0, ydelta ? *ydelta : 0.0,            ((gtype == GRID_XLOG) || (gtype == GRID_LOGLOG)),            ((gtype == GRID_YLOG) || (gtype == GRID_LOGLOG)),            nointerp);        rtn = TRUE;	goto quit;    }    /* See if there is one type we can give for the y scale... */    for (j = vecs->v_type, d = vecs->v_link2; d; d = d->v_link2)        if (d->v_type != j) {            j = SV_NOTYPE;            break;        }    if (devname && eq(devname, "xgraph")) {	/* Interface to XGraph-11 Plot Program */	ft_xgraph(xlims, ylims, hcopy,	    title ? title : vecs->v_plot->pl_title,	    xlabel ? xlabel : ft_typabbrev(vecs->v_scale->v_type),	    ylabel ? ylabel : ft_typabbrev(j),	    gtype, ptype, vecs);	rtn = TRUE;	goto quit;    }    for (d = vecs, i = 0; d; d = d->v_link2)        i++;    /* Figure out the X name and the X type.  This is sort of bad... */    xn = vecs->v_scale->v_name;    xt = vecs->v_scale->v_type;    pname = plot_cur->pl_typename;    if (!gr_init(xlims, ylims, (oneval ? (char *) NULL : xn),            title ? title : vecs->v_plot->pl_title, hcopy, i,            xdelta ? *xdelta : 0.0, ydelta ? *ydelta : 0.0, gtype,            ptype, xlabel, ylabel, xt, j, pname, cline))        goto quit;    /* Now plot all the graphs. */    for (d = vecs; d; d = d->v_link2)        ft_graf(d, oneval ? (struct dvec *) NULL : d->v_scale, FALSE);    gr_clean();    rtn = TRUE;quit:    free_pnode(names);quit1:    return rtn;}

⌨️ 快捷键说明

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