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

📄 adaptivity.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    }    case planeelementlt:{      fprintf (f_test," %20.10f "  ,Mm->ip[ipp].strain[0]);      fprintf (f_test," %20.10f "  ,Mm->ip[ipp].strain[1]);      fprintf (f_test," %20.10f \n",Mm->ip[ipp].strain[2]);      break;    }    case planeelementqt:    case planeelementsubqt:{      for (j=0;j<3;j++){	fprintf (f_test," %20.10f "  ,Mm->ip[ipp+j  ].strain[0]);	fprintf (f_test," %20.10f "  ,Mm->ip[ipp+j  ].strain[1]);	fprintf (f_test," %20.10f \n",Mm->ip[ipp+j+3].strain[2]);      }      break;    }    case lineartet:{      for (j=0;j<6;j++)	fprintf (f_test," %20.10f ",Mm->ip[ipp].strain[j]);            fprintf (f_test,"\n");      break;    }    default:{      fprintf (stderr,"\n\n unknown element type is required in function");      fprintf (stderr," adaptivity::print_test  (%s, line %d)",__FILE__,__LINE__);    }    }      }    if (otherflags & 8){    fprintf (f_test,"\n");        for (i=0;i<ne;i++){      ipp = Mt->elements[i].ipp[0][0];            switch ((long)Mt->elements[i].te){      case planeelementlt:{	fprintf (f_test," %20.10f "  ,Mm->ip[ipp].stress[0]);	fprintf (f_test," %20.10f "  ,Mm->ip[ipp].stress[1]);	fprintf (f_test," %20.10f \n",Mm->ip[ipp].stress[2]);	break;      }      default:{	fprintf (stderr,"\n\n unknown element type is required in function");	fprintf (stderr," adaptivity::print_test  (%s, line %d)",__FILE__,__LINE__);      }      }    }  }      // ***************************************************************************    fprintf (f_test,"\n\n RDERFULL \n\n");    for (i=0;i<ncomp*nn;i++){    fprintf (f_test," %20.10f ",rderfull[i]);    if ((i+1)%7==0)  fprintf (f_test,"\n");  }    if (otherflags & 8){    fprintf (f_test,"\n");        for (i=0;i<ncomp*nn;i++){      fprintf (f_test," %20.10f ",rderfull[i + ncomp*nn]);      if ((i+1)%7==0)  fprintf (f_test,"\n");    }  }    // ***************************************************************************    fprintf (f_test,"\n\n REFSIZEL \n\n");    for (i=0;i<Mt->ne;i++){    fprintf (f_test," %20.10f ",refsizel[i]);    if ((i+1)%7==0)  fprintf (f_test,"\n");  }    // ***************************************************************************    if (Mm->ip[0].eqother!=NULL){    fprintf (f_test,"\n\n OTHER \n\n");        for (i=0;i<Mm->tnip;i++){      for (j=0;j<6;j++)	fprintf (f_test," %20.10f "  ,Mm->ip[i].eqother[j]);            fprintf (f_test,"\n");    }  }    fclose (f_test);}//**********************//***  FINE PROBLEM  ***//**********************void adaptivity::compute_error_fine (void){  long i,j,auxl,te,necm,nncm,nnelcm,nesure;  long *nadjelnod,**adjelnod;  long *loccfmesh,**etnodes;  double **xyrr,thetaglob,e2cm,e2cmfine;  vector ei2(ne),ei2cm,ei2cmfine,theta,pom;  char auxfile[1023];  FILE *cmc,*edg,*cor;  if (Pelt==NULL)  Pelt = new planeelemlt;  if (Peqt==NULL)  Peqt = new planeelemqt;  if (Pesqt==NULL)  Pesqt = new planeelemsubqt;  if (Pelq==NULL)  Pelq = new planeelemlq;  if (Peqq==NULL)  Peqq = new planeelemqq;  // reading of edges.in  sprintf (auxfile,"%sedges.in%s",Mp->path,ni);  edg=fopen(auxfile,"r"); if (edg==NULL){ fprintf (stderr,"\n edg file has not been specified.\n Try it again!\n"); return ;}  fscanf (edg,"%ld",&nesure);  if (nesure!=ne) fprintf (stdout,"\n\n\n nesure!=ne \n\n\n ");  loccfmesh = new long [ne];  for (i=0;i<ne;i++){    fscanf (edg,"%ld",&auxl);    fscanf (edg,"%ld",loccfmesh+auxl-1);  }  fclose(edg);  // reading of cmchar.in  sprintf (auxfile,"%sproblem/cmeshchr%s",Mp->path,ni);  cmc=fopen(auxfile,"r"); if (cmc==NULL){fprintf (stderr,"\n cmc file has not been specified.\n Try it again!\n"); return ;}  fscanf (cmc,"%ld",&nncm);  nadjelnod = new long [nncm];  adjelnod = new long* [nncm];  xyrr = new double* [nncm];       for (i=0;i<nncm;i++)    xyrr[i] = new double [7];  for (i=0;i<nncm;i++){    for (j=0;j<7;j++)      fscanf (cmc,"%lf",xyrr[i]+j);    fscanf (cmc,"%ld",nadjelnod+i);    adjelnod[i] = new long [nadjelnod[i]];    for (j=0;j<nadjelnod[i];j++)      fscanf (cmc,"%ld",adjelnod[i]+j);  }  fscanf (cmc,"%ld",&necm);  etnodes = new long* [necm];  allocv (necm,ei2cm);  for (i=0;i<necm;i++){    fscanf (cmc,"%ld %ld",&te,&nnelcm);    etnodes[i] = new long [nnelcm+2];    etnodes[i][0] = te;    etnodes[i][1] = nnelcm;    for (j=2;j<nnelcm+2;j++)      fscanf (cmc,"%ld",etnodes[i]+j);    fscanf (cmc,"%lf",ei2cm.a+i);  }  fclose(cmc);  // computing  for (i=0;i<ne;i++){    te = Mt->give_elem_type (i);        switch (te){    case planeelementqt:{      Peqt->compute_error_fine (i,etnodes[loccfmesh[i]-1],xyrr,rderfull,ei2[i]);      break;    }    default:{      fprintf (stderr,"\n\n unknown element type is required in function");      fprintf (stderr," adaptivity::compute_error_fine (%s, line %d)",__FILE__,__LINE__);    }    }  }   //fprintf_vector (stdout,ei2,"ei2:",10);      allocv (necm,ei2cmfine);  allocv (necm,theta);    for (i=0;i<ne;i++)    ei2cmfine[loccfmesh[i]-1] += ei2[i];    e2cm = e2cmfine = 0.0;  for (i=0;i<necm;i++){    e2cm     += ei2cm    [i];              fprintf (stdout,"\n [%ld] %f",i,ei2cm[i]);    e2cmfine += ei2cmfine[i];              fprintf (stdout,"   %f",ei2cmfine[i]);  }                                        //fprintf (stdout,"\n %f",e2cm); fprintf (stdout,"\n %f",e2cmfine);  fprintf (stdout,"\n e2cm = %f",e2cm);  fprintf (stdout,"\n e2cmfine = %f",e2cmfine);    // compute theta  thetaglob = sqrt(e2cm/e2cmfine);  fprintf (stdout,"\n thetaglob =  %f",thetaglob);  fprintf (stdout,"\n correction =  %f",1/thetaglob);    for (i=0;i<necm;i++)    theta[i] = sqrt(ei2cm[i]/ei2cmfine[i]);    for (i=0;i<necm;i++)    if (theta[i] > 3.0) theta[i] = 1.5;    //fprintf_vector (stdout,theta,"theta",10);  sprintf (auxfile,"%stheta%s",Mp->path,ni);  print_thetacon (auxfile,nadjelnod,adjelnod,nncm,necm,xyrr,etnodes,theta.a);    //  print theta in interval (-**;0.65> A <1.5;**)  fprintf(stdout,"\n ");  for (j=0,i=0;i<necm;i++)    if (theta[i]>1.5 ){      fprintf (stdout,"[%3ld] = %5.3f  ",i,theta[i]);   j++;      if ((j)%6==0) fprintf(stdout,"\n ");    }  fprintf (stdout,"\n j =  %ld",j);    //  print correc_file  sprintf (auxfile,"%scorrec.txt",Mp->path);  cor = fopen (auxfile,"a"); if (cor==NULL){fprintf(stderr,"\n cor file has not been specified.\n Try it again!\n"); return ;}  fprintf (cor,"%.3f\n",1/thetaglob);  fclose (cor);      for (i=0;i<necm;i++){ delete [] etnodes[i];     }  for (i=0;i<nncm;i++){ delete [] adjelnod[i];                        delete [] xyrr[i];        }  delete [] etnodes;  delete [] adjelnod;  delete [] xyrr;  delete [] loccfmesh;  delete [] nadjelnod;  /*  for (i=0;i<necm;i++){    etnodes [i][0] = 1;    etnodes [i][1] = etnodes [i][2]+1 ;    etnodes [i][2] = etnodes [i][3]+1 ;    etnodes [i][3] = etnodes [i][4]+1 ;  }  // print deltasigxcon  for (i=0;i<nncm;i++){    for (j=0;j<nn;j++)      if (Gt->gnodes[j].x == xyrr[i][0] && Gt->gnodes[j].y == xyrr[i][1])	if ((rderfull[j] - xyrr[i][4]) < 0.0)	  xyrr[i][3] = -(rderfull[j] - xyrr[i][4]);	else	  xyrr[i][3] =   rderfull[0*nn+j] - xyrr[i][4] ;    xyrr[i][2] = 0.0;    xyrr[i][3] *= 1000.0;  }  print_confile ("fine_problem/deltasigx.",nncm,necm,necm,xyrr,etnodes,ni,dim); */}void adaptivity::print_thetacon ( char *file, long *nadjelnod,long **adjelnod,long nncm,long necm,double **xyrr,long **etnodes, double *theta){  long i,j,te,nmidp;  long **auxnod;  double **auxxyzv;  vector valnod(nncm);  auxxyzv = new double* [nncm+necm];  auxnod = new long* [necm];  // computing of valnod  for (i=0;i<nncm;i++){    for (j=0;j<nadjelnod[i];j++){      valnod[i] += theta[adjelnod[i][j]];     }    valnod[i] /= (double)nadjelnod[i];   }  // assemble aux*  for (i=0;i<nncm;i++){    auxxyzv[i] = new double [4];    auxxyzv[i][0] = xyrr[i][0];    auxxyzv[i][1] = xyrr[i][1];    auxxyzv[i][2] = 0.0;    auxxyzv[i][3] = valnod[i];  }  for (i=0;i<necm;i++){    if (etnodes[i][0] == 23 || etnodes[i][0] == 24){      auxxyzv[i+nncm] = new double [4];      auxxyzv[i+nncm][0] = (xyrr[etnodes[i][0+2]][0] + xyrr[etnodes[i][1+2]][0] + xyrr[etnodes[i][2+2]][0] + xyrr[etnodes[i][3+2]][0]) / 4;      auxxyzv[i+nncm][1] = (xyrr[etnodes[i][0+2]][1] + xyrr[etnodes[i][1+2]][1] + xyrr[etnodes[i][2+2]][1] + xyrr[etnodes[i][3+2]][1]) / 4;      auxxyzv[i+nncm][2] = 0.0;      auxxyzv[i+nncm][3] = theta[i];    }    else      auxxyzv[i+nncm] = NULL;  }  nmidp = nncm;  for (i=0;i<necm;i++){    te = etnodes[i][0];    nmidp++;    switch (te){    case planeelementlt:{      auxnod[i] = new long [4];      auxnod[i][0] = 1;   auxnod[i][ 1] = etnodes[i][0+2]+1;   auxnod[i][ 2] = etnodes[i][1+2]+1;   auxnod[i][ 3] = etnodes[i][2+2]+1;      break;    }    case planeelementqt:{      auxnod[i] = new long [13];      auxnod[i][0] = 4;   auxnod[i][ 1] = etnodes[i][0+2]+1;   auxnod[i][ 2] = etnodes[i][3+2]+1;   auxnod[i][ 3] = etnodes[i][5+2]+1;                          auxnod[i][ 4] = etnodes[i][3+2]+1;   auxnod[i][ 5] = etnodes[i][1+2]+1;   auxnod[i][ 6] = etnodes[i][4+2]+1;                          auxnod[i][ 7] = etnodes[i][4+2]+1;   auxnod[i][ 8] = etnodes[i][2+2]+1;   auxnod[i][ 9] = etnodes[i][5+2]+1;                          auxnod[i][10] = etnodes[i][3+2]+1;   auxnod[i][11] = etnodes[i][4+2]+1;   auxnod[i][12] = etnodes[i][5+2]+1;      break;    }    case planeelementlq:{      auxnod[i] = new long [13];      auxnod[i][0] = 4;   auxnod[i][ 1] = etnodes[i][0+2]+1;   auxnod[i][ 2] = etnodes[i][1+2]+1;   auxnod[i][ 3] = nmidp;                          auxnod[i][ 4] = etnodes[i][1+2]+1;   auxnod[i][ 5] = etnodes[i][2+2]+1;   auxnod[i][ 6] = nmidp;                          auxnod[i][ 7] = etnodes[i][2+2]+1;   auxnod[i][ 8] = etnodes[i][3+2]+1;   auxnod[i][ 9] = nmidp;                          auxnod[i][10] = etnodes[i][3+2]+1;   auxnod[i][11] = etnodes[i][0+2]+1;   auxnod[i][12] = nmidp;      break;    }    case planeelementqq:{      auxnod[i] = new long [25];      auxnod[i][0] = 8;   auxnod[i][ 1] = etnodes[i][0+2]+1;   auxnod[i][ 2] = etnodes[i][4+2]+1;   auxnod[i][ 3] = nmidp;                          auxnod[i][ 4] = etnodes[i][4+2]+1;   auxnod[i][ 5] = etnodes[i][1+2]+1;   auxnod[i][ 6] = nmidp;                          auxnod[i][ 7] = etnodes[i][1+2]+1;   auxnod[i][ 8] = etnodes[i][5+2]+1;   auxnod[i][ 9] = nmidp;                          auxnod[i][10] = etnodes[i][5+2]+1;   auxnod[i][11] = etnodes[i][2+2]+1;   auxnod[i][12] = nmidp;                          auxnod[i][13] = etnodes[i][2+2]+1;   auxnod[i][14] = etnodes[i][6+2]+1;   auxnod[i][15] = nmidp;                          auxnod[i][16] = etnodes[i][6+2]+1;   auxnod[i][17] = etnodes[i][3+2]+1;   auxnod[i][18] = nmidp;                          auxnod[i][19] = etnodes[i][3+2]+1;   auxnod[i][20] = etnodes[i][7+2]+1;   auxnod[i][21] = nmidp;                          auxnod[i][22] = etnodes[i][7+2]+1;   auxnod[i][23] = etnodes[i][0+2]+1;   auxnod[i][24] = nmidp;      break;    }    default:{      fprintf (stderr,"\n\n unknown element type is required in function");      fprintf (stderr," adaptivity::print_thetacon (%s, line %d)",__FILE__,__LINE__);    }    }  }  print_confile (file,nncm,necm,auxxyzv,auxnod,dim);  for (i=0;i<nncm+necm;i++)    delete [] auxxyzv[i];  for (i=0;i<necm;i++)    delete [] auxnod[i];  delete [] auxxyzv;  delete [] auxnod;}void adaptivity::print_coarsemesh ( double *ei2){  long i,j,te,nne,*cn;  double r[2];  ivector nodes;  char file[1023];  FILE *cmchar;    sprintf (file,"%scmeshchr%s",Mp->path,ni);  cmchar = fopen (file,"w");                 if (cmchar==NULL) fprintf (stderr,"\n .cmchar file has not been specified.\n Try it again!\n");    // ** nastaveno pro 2D , lcid = 0  , codenumbers na noudech , d na prvku konstantni!!!!!!!!!!!!!!!!!!    fprintf (cmchar,"%ld\n\n",nn);    for (i=0;i<nn;i++){    cn = Gtm->gnodes[i].cn;    for (j=0;j<2;j++){      if        (cn[j]>0)   r[j]=Lsrs->lhs[cn[j]-1];      else if   (cn[j]==0)  r[j]=0.0;           else             r[j]=Mb->lc[0].pd[0-cn[j]-1];    }    fprintf (cmchar," %15.7e %15.7e %15.7e %15.7e",Gtm->gnodes[i].x,Gtm->gnodes[i].y,r[0],r[1]);    fprintf (cmchar," %15.7e %15.7e %15.7e %6ld"  ,rderfull[i],rderfull[nn+i],rderfull[2*nn+i],Gtm->nadjelnod[i]);    for (j=0;j<Gtm->nadjelnod[i];j++)      fprintf (cmchar,"%6ld",Gtm->adjelnod[i][j]);    fprintf (cmchar,"\n");  }    fprintf (cmchar,"\n\n%ld\n\n",ne);    for (i=0;i<ne;i++){    te = Mt->give_elem_type (i);    nne = Mt->give_nne_inner ((elemtype)te);    allocv (nne,nodes);        Gtm->give_nodes (i,nodes);        fprintf (cmchar,"  %2ld  %2ld",te,nne);    for (j=0;j<nne;j++)      fprintf (cmchar,"%6ld ",nodes.a[j]);        fprintf (cmchar,"%15.7f\n",ei2[i]);        destrv (nodes);  }    fclose (cmchar);}

⌨️ 快捷键说明

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