// hsolvdoc.cpp : implementation of the Chsolvdoc class // #include #include #include #include #include #include "hsolv.h" #include "hsolvDlg.h" #include "mesh.h" #include "spars.h" #include "hsolvdoc.h" ///////////////////////////////////////////////////////////////////////////// // Chsolvdoc construction/destruction Chsolvdoc::Chsolvdoc() { TheView=NULL; Precision=NULL; LengthUnits=NULL; ProblemType=NULL; Coords=NULL; BandWidth=NULL; NumNodes=NULL; NumEls=NULL; NumBlockProps=NULL; NumPBCs=NULL; NumLineProps=NULL; NumPointProps=NULL; NumCircProps=NULL; NumBlockLabels=NULL; meshnode=NULL; meshele=NULL; Tprev=NULL; blockproplist=NULL; lineproplist=NULL; nodeproplist=NULL; circproplist=NULL; labellist=NULL; pbclist=NULL; PathName=NULL; extRo=extRi=extZo=NULL; } Chsolvdoc::~Chsolvdoc() { // This space for rent. } void Chsolvdoc::CleanUp() { if (meshnode!=NULL) free(meshnode); if (meshele!=NULL) free(meshele); if (blockproplist!=NULL) free(blockproplist); if (lineproplist!=NULL) free(lineproplist); if (nodeproplist!=NULL) free(nodeproplist); if (circproplist!=NULL) free(circproplist); if (labellist!=NULL) free(labellist); if (pbclist!=NULL) free(pbclist); if (Tprev!=NULL) free(Tprev); } ///////////////////////////////////////////////////////////////////////////// // Chsolvdoc commands char* StripKey(char *c) { char *d; int i,k; k=(int) strlen(c); for(i=0;i0) nodeproplist=(CPointProp *)calloc(k,sizeof(CPointProp)); q[0]=NULL; } if( _strnicmp(q,"",11)==0){ PProp.V=0; PProp.qp=0; q[0]=NULL; } if( _strnicmp(q,"",4)==0){ v=StripKey(s); sscanf(v,"%lf",&PProp.V); q[0]=NULL; } if( _strnicmp(q,"",4)==0){ v=StripKey(s); sscanf(v,"%lf",&PProp.qp); q[0]=NULL; } if( _strnicmp(q,"",9)==0){ nodeproplist[NumPointProps]=PProp; NumPointProps++; q[0]=NULL; } // Boundary Properties; if( _strnicmp(q,"[bdryprops]",11)==0){ v=StripKey(s); sscanf(v,"%i",&k); if (k>0) lineproplist=(CBoundaryProp *)calloc(k,sizeof(CBoundaryProp)); q[0]=NULL; } if( _strnicmp(q,"",11)==0){ BProp.BdryFormat=0; BProp.Tset=0; BProp.Tinf=0; BProp.qs=0; BProp.beta=0; BProp.h=0; q[0]=NULL; } if( _strnicmp(q,"",10)==0){ v=StripKey(s); sscanf(v,"%i",&BProp.BdryFormat); q[0]=NULL; } if( _strnicmp(q,"",6)==0){ v=StripKey(s); sscanf(v,"%lf",&BProp.Tset); q[0]=NULL; } if( _strnicmp(q,"",4)==0){ v=StripKey(s); sscanf(v,"%lf",&BProp.qs); q[0]=NULL; } if( _strnicmp(q,"",6)==0){ v=StripKey(s); sscanf(v,"%lf",&BProp.beta); q[0]=NULL; } if( _strnicmp(q,"",3)==0){ v=StripKey(s); sscanf(v,"%lf",&BProp.h); q[0]=NULL; } if( _strnicmp(q,"",6)==0){ v=StripKey(s); sscanf(v,"%lf",&BProp.Tinf); q[0]=NULL; } if( _strnicmp(q,"",9)==0){ lineproplist[NumLineProps]=BProp; NumLineProps++; q[0]=NULL; } // Block Properties; if( _strnicmp(q,"[blockprops]",12)==0){ v=StripKey(s); sscanf(v,"%i",&k); if (k>0) blockproplist=(CMaterialProp *)calloc(k,sizeof(CMaterialProp)); q[0]=NULL; } // timestep if( _strnicmp(q,"[dt]",4)==0){ v=StripKey(s); sscanf(v,"%lf",&dT); q[0]=NULL; } // Previous Solution File if( _strnicmp(q,"[prevsoln]",10)==0){ int i; v=StripKey(s); // have to do this carefully to accept a filename with spaces k=(int) strlen(v); for(i=0;i0) for(i=k-1;i>=0;i--){ if(v[i]=='\"'){ v[i]=0; i=-1; } } PrevSoln=v; q[0]=NULL; } if( _strnicmp(q,"",12)==0){ MProp.Kx=1; MProp.Ky=1; // permittivity, relative MProp.Kt=0; MProp.qv=0; // charge density, C/m^3 MProp.npts=0; q[0]=NULL; } if( _strnicmp(q,"",6)==0){ v=StripKey(s); sscanf(v,"%lf",&MProp.Kx); q[0]=NULL; } if( _strnicmp(q,"",6)==0){ v=StripKey(s); sscanf(v,"%lf",&MProp.Ky); q[0]=NULL; } if( _strnicmp(q,"",6)==0){ v=StripKey(s); sscanf(v,"%lf",&MProp.Kt); MProp.Kt*=1.e6; q[0]=NULL; } if( _strnicmp(q,"",5)==0){ v=StripKey(s); sscanf(v,"%lf",&MProp.qv); q[0]=NULL; } if( _strnicmp(q,"",10)==0){ v=StripKey(s); sscanf(v,"%i",&MProp.npts); if (MProp.npts>0) { for(j=0;j",9)==0){ blockproplist[NumBlockProps]=MProp; NumBlockProps++; q[0]=NULL; } // Conductor Properties if( _strnicmp(q,"[conductorprops]",16)==0){ v=StripKey(s); sscanf(v,"%i",&k); if(k>0) circproplist=(CCircuit *)calloc(k,sizeof(CCircuit)); q[0]=NULL; } if( _strnicmp(q,"",16)==0){ CProp.V=0; CProp.q=0; CProp.CircType=0; q[0]=NULL; } if( _strnicmp(q,"",4)==0){ v=StripKey(s); sscanf(v,"%lf",&CProp.V); q[0]=NULL; } if( _strnicmp(q,"",4)==0){ v=StripKey(s); sscanf(v,"%lf",&CProp.q); q[0]=NULL; } if( _strnicmp(q,"",15)==0){ v=StripKey(s); sscanf(v,"%i",&CProp.CircType); q[0]=NULL; } if( _strnicmp(q,"",14)==0){ circproplist[NumCircProps]=CProp; NumCircProps++; q[0]=NULL; } // read in regional attributes if(_strnicmp(q,"[numblocklabels]",13)==0){ int i; v=StripKey(s); sscanf(v,"%i",&k); if (k>0) labellist=(CBlockLabel *)calloc(k, sizeof(CBlockLabel)); NumBlockLabels=k; for(i=0;i1){ // strip off point BC number; j=n & 0xffff; j=j-2; if (j<0) j=-1; // strip off Conductor number n= (n - (n & 0xffff))/0x10000 - 1; } else{ j=-1; n=-1; } node.bc=j; node.InConductor=n; // convert all lengths to internal working units of mm node.x*=c[LengthUnits]; node.y*=c[LengthUnits]; meshnode[i]=node; } fclose(fp); //read in periodic boundary conditions; sprintf(infile,"%s.pbc",PathName); if((fp=fopen(infile,"rt"))==NULL){ return FALSE; } fgets(s,1024,fp); sscanf(s,"%i",&k); NumPBCs=k; if (k!=0) pbclist=(CCommonPoint *)calloc(k,sizeof(CCommonPoint)); CCommonPoint pbc; for(i=0;i=0) { meshnode[n0].InConductor=n; meshnode[n1].InConductor=n; } } else j=-1; if (j>=0) { // search through elements to find one containing the line; // set corresponding edge equal to the bc number for(q=0,n=FALSE;q=Re(Kn[npts-1])) return (Im(Kn[npts-1])*(1+I)); for(i=0,j=1;j=Re(Kn[i])) && (t<=Re(Kn[j]))) { return (1+I)*(Im(Kn[i])+Im(Kn[j]-Kn[i])*Re(t-Kn[i])/Re(Kn[j]-Kn[i])); } } return (Kx+I*Ky); }