Main Page | Directories | File List | File Members

Bohm_potential.h File Reference

#include "../linear_solver/ludcmp.h"
#include "../linear_solver/lubksb.h"

Go to the source code of this file.

Functions

void Bohm_potential (void)


Function Documentation

void Bohm_potential void   ) 
 

Definition at line 35 of file Bohm_potential.h.

References b, coord, free(), HBAR, i_dom, M, MSTAR, NE, Ne, Ng, noeud_geo, Q, V, and xi.

Referenced by main().

00036 {
00037  int i,j;
00038  double *v;
00039  double *nabla2R;
00040  double *R;
00041  double *ac[4],*bc[4],*cc[4],*dc[4];
00042  double *xi[3], l[4];
00043  double dx,dy,dz;
00044  
00045 // infinitesimal increments = 5 Angstrom
00046  dx=0.5e-9; dy=0.5e-9; dz=0.5e-9;
00047  
00048  v=malloc((Ng+1)*sizeof(double));
00049  nabla2R=malloc((Ng+1)*sizeof(double));
00050  R=malloc((Ng+1)*sizeof(double));
00051  for(i=0;i<3;i++) xi[i]=malloc((Ne+1)*sizeof(double));
00052  for(i=0;i<4;i++){
00053    ac[i]=malloc((Ne+1)*sizeof(double));
00054    bc[i]=malloc((Ne+1)*sizeof(double));
00055    cc[i]=malloc((Ne+1)*sizeof(double));
00056    dc[i]=malloc((Ne+1)*sizeof(double));
00057  }
00058 
00059 // barycentric coordinates of the Guass point
00060  l[0]=0.25;  l[1]=0.25;  l[2]=0.25;  l[3]=0.25;
00061 
00062 // calculation of the center of mass coordinates for every element
00063  for(i=0;i<Ne;i++){
00064       xi[0][i]=l[0]*coord[0][noeud_geo[0][i]-1]
00065               +l[1]*coord[0][noeud_geo[1][i]-1]
00066               +l[2]*coord[0][noeud_geo[2][i]-1]
00067               +l[3]*coord[0][noeud_geo[3][i]-1];
00068       xi[1][i]=l[0]*coord[1][noeud_geo[0][i]-1]
00069               +l[1]*coord[1][noeud_geo[1][i]-1]
00070               +l[2]*coord[1][noeud_geo[2][i]-1]
00071               +l[3]*coord[1][noeud_geo[3][i]-1];
00072       xi[2][i]=l[0]*coord[2][noeud_geo[0][i]-1]
00073               +l[1]*coord[2][noeud_geo[1][i]-1]
00074               +l[2]*coord[2][noeud_geo[2][i]-1]
00075               +l[3]*coord[2][noeud_geo[3][i]-1];
00076 //    printf("%g %g %g\n",xi[0][j][i],xi[1][j][i],xi[2][j][i]);
00077     }
00078 
00079 // calculation of the theta functions for every element
00080  for(i=0;i<Ne;i++){
00081     int l;
00082     int n=4;
00083     int indx[5];
00084     double d;
00085     double a[5][5];
00086     double b[5];
00087 
00088 // definition of the a matrix for the linear system
00089     {int k;
00090      for(k=0;k<4;k++){
00091        a[k+1][1]=coord[0][noeud_geo[k][i]-1];
00092        a[k+1][2]=coord[1][noeud_geo[k][i]-1];
00093        a[k+1][3]=coord[2][noeud_geo[k][i]-1];
00094        a[k+1][4]=1.;
00095      }}
00096 // LU decomposition of the A matrix
00097 #include "../linear_solver/ludcmp.h"
00098     for(l=0;l<4;l++){
00099       if(l==0){b[1]=1.;b[2]=0.;b[3]=0.;b[4]=0.;}
00100       if(l==1){b[1]=0.;b[2]=1.;b[3]=0.;b[4]=0.;}
00101       if(l==2){b[1]=0.;b[2]=0.;b[3]=1.;b[4]=0.;}
00102       if(l==3){b[1]=0.;b[2]=0.;b[3]=0.;b[4]=1.;}
00103 #include "../linear_solver/lubksb.h"
00104       ac[l][i]=b[1]; bc[l][i]=b[2]; cc[l][i]=b[3]; dc[l][i]=b[4];
00105 // printf("%g %g %g %g\n",b[1],b[2],b[3],b[4]);
00106     } // end of l-cycle
00107 
00108 // definition of R field on each node
00109     for(j=0;j<4;j++) R[noeud_geo[j][i]-1]=sqrt(NE[noeud_geo[j][i]-1]);
00110  } // end of i-cycle
00111 
00112 // just in case...
00113  for(i=0;i<Ng;i++) nabla2R[i]=0.;
00114 
00115 // definition of laplacian of R on each node
00116  for(i=0;i<Ne;i++){
00117    double h1,h2,h3;
00118 // second order finite difference scheme
00119    h1=R[noeud_geo[0][i]-1]*(ac[0][i]*(xi[0][i]+dx)+bc[0][i]*xi[1][i]+cc[0][i]*xi[2][i]+dc[0][i])
00120      +R[noeud_geo[1][i]-1]*(ac[1][i]*(xi[0][i]+dx)+bc[1][i]*xi[1][i]+cc[1][i]*xi[2][i]+dc[1][i])
00121      +R[noeud_geo[2][i]-1]*(ac[2][i]*(xi[0][i]+dx)+bc[2][i]*xi[1][i]+cc[2][i]*xi[2][i]+dc[2][i])
00122      +R[noeud_geo[3][i]-1]*(ac[3][i]*(xi[0][i]+dx)+bc[3][i]*xi[1][i]+cc[3][i]*xi[2][i]+dc[3][i]);
00123    h2=R[noeud_geo[0][i]-1]*(ac[0][i]*xi[0][i]+bc[0][i]*xi[1][i]+cc[0][i]*xi[2][i]+dc[0][i])
00124      +R[noeud_geo[1][i]-1]*(ac[1][i]*xi[0][i]+bc[1][i]*xi[1][i]+cc[1][i]*xi[2][i]+dc[1][i])
00125      +R[noeud_geo[2][i]-1]*(ac[2][i]*xi[0][i]+bc[2][i]*xi[1][i]+cc[2][i]*xi[2][i]+dc[2][i])
00126      +R[noeud_geo[3][i]-1]*(ac[3][i]*xi[0][i]+bc[3][i]*xi[1][i]+cc[3][i]*xi[2][i]+dc[3][i]);
00127    h3=R[noeud_geo[0][i]-1]*(ac[0][i]*(xi[0][i]-dx)+bc[0][i]*xi[1][i]+cc[0][i]*xi[2][i]+dc[0][i])
00128      +R[noeud_geo[1][i]-1]*(ac[1][i]*(xi[0][i]-dx)+bc[1][i]*xi[1][i]+cc[1][i]*xi[2][i]+dc[1][i])
00129      +R[noeud_geo[2][i]-1]*(ac[2][i]*(xi[0][i]-dx)+bc[2][i]*xi[1][i]+cc[2][i]*xi[2][i]+dc[2][i])
00130      +R[noeud_geo[3][i]-1]*(ac[3][i]*(xi[0][i]-dx)+bc[3][i]*xi[1][i]+cc[3][i]*xi[2][i]+dc[3][i]);
00131    for(j=0;j<4;j++) nabla2R[noeud_geo[j][i]-1]+=(h1-2.*h2+h3)/(dx*dx);
00132    h1=R[noeud_geo[0][i]-1]*(ac[0][i]*xi[0][i]+bc[0][i]*(xi[1][i]+dy)+cc[0][i]*xi[2][i]+dc[0][i])
00133      +R[noeud_geo[1][i]-1]*(ac[1][i]*xi[0][i]+bc[1][i]*(xi[1][i]+dy)+cc[1][i]*xi[2][i]+dc[1][i])
00134      +R[noeud_geo[2][i]-1]*(ac[2][i]*xi[0][i]+bc[2][i]*(xi[1][i]+dy)+cc[2][i]*xi[2][i]+dc[2][i])
00135      +R[noeud_geo[3][i]-1]*(ac[3][i]*xi[0][i]+bc[3][i]*(xi[1][i]+dy)+cc[3][i]*xi[2][i]+dc[3][i]);
00136    h2=R[noeud_geo[0][i]-1]*(ac[0][i]*xi[0][i]+bc[0][i]*xi[1][i]+cc[0][i]*xi[2][i]+dc[0][i])
00137      +R[noeud_geo[1][i]-1]*(ac[1][i]*xi[0][i]+bc[1][i]*xi[1][i]+cc[1][i]*xi[2][i]+dc[1][i])
00138      +R[noeud_geo[2][i]-1]*(ac[2][i]*xi[0][i]+bc[2][i]*xi[1][i]+cc[2][i]*xi[2][i]+dc[2][i])
00139      +R[noeud_geo[3][i]-1]*(ac[3][i]*xi[0][i]+bc[3][i]*xi[1][i]+cc[3][i]*xi[2][i]+dc[3][i]);
00140    h3=R[noeud_geo[0][i]-1]*(ac[0][i]*xi[0][i]+bc[0][i]*(xi[1][i]-dy)+cc[0][i]*xi[2][i]+dc[0][i])
00141      +R[noeud_geo[1][i]-1]*(ac[1][i]*xi[0][i]+bc[1][i]*(xi[1][i]-dy)+cc[1][i]*xi[2][i]+dc[1][i])
00142      +R[noeud_geo[2][i]-1]*(ac[2][i]*xi[0][i]+bc[2][i]*(xi[1][i]-dy)+cc[2][i]*xi[2][i]+dc[2][i])
00143      +R[noeud_geo[3][i]-1]*(ac[3][i]*xi[0][i]+bc[3][i]*(xi[1][i]-dy)+cc[3][i]*xi[2][i]+dc[3][i]);
00144    for(j=0;j<4;j++) nabla2R[noeud_geo[j][i]-1]+=(h1-2.*h2+h3)/(dy*dy);
00145    h1=R[noeud_geo[0][i]-1]*(ac[0][i]*xi[0][i]+bc[0][i]*xi[1][i]+cc[0][i]*(xi[2][i]+dz)+dc[0][i])
00146      +R[noeud_geo[1][i]-1]*(ac[1][i]*xi[0][i]+bc[1][i]*xi[1][i]+cc[1][i]*(xi[2][i]+dz)+dc[1][i])
00147      +R[noeud_geo[2][i]-1]*(ac[2][i]*xi[0][i]+bc[2][i]*xi[1][i]+cc[2][i]*(xi[2][i]+dz)+dc[2][i])
00148      +R[noeud_geo[3][i]-1]*(ac[3][i]*xi[0][i]+bc[3][i]*xi[1][i]+cc[3][i]*(xi[2][i]+dz)+dc[3][i]);
00149    h2=R[noeud_geo[0][i]-1]*(ac[0][i]*xi[0][i]+bc[0][i]*xi[1][i]+cc[0][i]*xi[2][i]+dc[0][i])
00150      +R[noeud_geo[1][i]-1]*(ac[1][i]*xi[0][i]+bc[1][i]*xi[1][i]+cc[1][i]*xi[2][i]+dc[1][i])
00151      +R[noeud_geo[2][i]-1]*(ac[2][i]*xi[0][i]+bc[2][i]*xi[1][i]+cc[2][i]*xi[2][i]+dc[2][i])
00152      +R[noeud_geo[3][i]-1]*(ac[3][i]*xi[0][i]+bc[3][i]*xi[1][i]+cc[3][i]*xi[2][i]+dc[3][i]);
00153    h3=R[noeud_geo[0][i]-1]*(ac[0][i]*xi[0][i]+bc[0][i]*xi[1][i]+cc[0][i]*(xi[2][i]-dz)+dc[0][i])
00154      +R[noeud_geo[1][i]-1]*(ac[1][i]*xi[0][i]+bc[1][i]*xi[1][i]+cc[1][i]*(xi[2][i]-dz)+dc[1][i])
00155      +R[noeud_geo[2][i]-1]*(ac[2][i]*xi[0][i]+bc[2][i]*xi[1][i]+cc[2][i]*(xi[2][i]-dz)+dc[2][i])
00156      +R[noeud_geo[3][i]-1]*(ac[3][i]*xi[0][i]+bc[3][i]*xi[1][i]+cc[3][i]*(xi[2][i]-dz)+dc[3][i]);
00157    for(j=0;j<4;j++) nabla2R[noeud_geo[j][i]-1]+=(h1-2.*h2+h3)/(dz*dz);
00158  }
00159 
00160  for(i=0;i<Ng;i++) v[i]=0.; // just in case...
00161  
00162 // updates the potential by means of Bohm potential
00163  for(i=0;i<Ne;i++){
00164   for(j=0;j<4;j++)
00165    if(R[noeud_geo[j][i]-1]!=0.)
00166      V[noeud_geo[j][i]-1]+=-(HBAR*HBAR/(2.*MSTAR[i_dom[i]][1]*M*Q))
00167                          *nabla2R[noeud_geo[j][i]-1]/R[noeud_geo[j][i]-1];
00168 // printf("QV = %g\n",-(HBAR*HBAR/(2.*MSTAR[i_dom[i]][1]*M*Q))*nabla2R[noeud_geo[0][i]-1]/R[noeud_geo[0][i]-1]);
00169 //printf("QV = %g\n",V[noeud_geo[0][i]-1]);
00170  }
00171  
00172 // free precedently allocated memory
00173  free(v);
00174  free(R);
00175  free(nabla2R);
00176  for(i=0;i<3;i++) free(xi[i]);
00177  for(i=0;i<4;i++){
00178    free(ac[i]);
00179    free(bc[i]);
00180    free(cc[i]);
00181    free(dc[i]);
00182  }
00183 }


© sourcejam.com 2005-2008