Skip to content

Instantly share code, notes, and snippets.

@ktchernov
Created November 27, 2014 22:49
Show Gist options
  • Save ktchernov/d553549b74994f5fd129 to your computer and use it in GitHub Desktop.
Save ktchernov/d553549b74994f5fd129 to your computer and use it in GitHub Desktop.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<time.h>
#include "mpi.h"
#define PI 3.1415926535897931
#define OBSTYP 0
#define OBSM 1
#define dist2(x,x1,y,y1,z,z1) ((((x)-(x1))*((x)-(x1)))+(((y)-(y1))*((y)-(y1)))+(((z)-(z1))*((z)-(z1))))
#define crossx(x,y,z,x1,y1,z1) (((y)*(z1))-((z)*(y1)))
#define crossy(x,y,z,x1,y1,z1) (((z)*(x1))-((x)*(z1)))
#define crossz(x,y,z,x1,y1,z1) (((x)*(y1))-((y)*(x1)))
#define u11(ux,uy,uz,c,s) ((c)+(ux)*(ux)*((1.0)-(c)))
#define u12(ux,uy,uz,c,s) (((ux)*(uy)*((1.0)-(c)))-((uz)*(s)))
#define u13(ux,uy,uz,c,s) (((ux)*(uz)*((1.0)-(c)))+((uy)*(s)))
#define u21(ux,uy,uz,c,s) (((ux)*(uy)*((1.0)-(c)))+((uz)*(s)))
#define u22(ux,uy,uz,c,s) ((c)+(uy)*(uy)*((1.0)-(c)))
#define u23(ux,uy,uz,c,s) (((uy)*(uz)*((1.0)-(c)))-((ux)*(s)))
#define u31(ux,uy,uz,c,s) (((ux)*(uz)*((1.0)-(c)))-((uy)*(s)))
#define u32(ux,uy,uz,c,s) (((uy)*(uz)*((1.0)-(c)))+((ux)*(s)))
#define u33(ux,uy,uz,c,s) ((c)+(uz)*(uz)*((1.0)-(c)))
struct aftr
{
unsigned long int n,plane,pn,n1,n2,typ;
double xreal,yreal,zreal,x0,y0,z0,r;
double vx,vy,vz,ax,ay,az,fx,fy,fz,PE,hl,bn;
double round,body,cenben,kbd,fl;
double nx,ny,nz,nx0,ny0,nz0,tx,ty,tz,cangle1;
double cx,cy,cz,epx,emx,epy,emy,epz,emz;
double xa,ya,za,mass,rad,rad2,D;
struct aftr *flagella[2],*helix[2];
};
struct CM
{
double xreal,yreal,zreal,xc0,yc0,zc0;
double vx,vy,vz,fx,fy,fz,cx,cy,cz;
};
struct cnline
{
double xreal,yreal,zreal;
double dirx,diry,dirz;
double radius2,radius;
double cx,cy,cz;
};
struct sol
{
unsigned long int n,in,pn;
double x,y,z,vx,vy,vz;
double xa,ya,za;
};
struct wallp
{
unsigned long int n,in,pn;
double x,y,z,vx,vy,vz,vrx,vry,vrz;
double xa,ya,za;
};
struct redcell
{
unsigned long int id,ip,partnr;
double xcm,ycm,zcm,rx,ry,rz;
double ex,ey,ez;
double Vxcm,Vycm,Vzcm;
double wx,wy,wz;
double Momx,Momy,Momz,Amomx,Amomy,Amomz,coltim;
};
struct cellVCM
{
double Vx,Vy,Vz,Vnx,Vny,Vnz;
double S;
double xcm,ycm,zcm,crx,cry,crz;
double r11,r12,r13,r21,r22,r23,r31,r32,r33;
double xx,yy,zz;
};
/*****************************/
unsigned long int L,Lr1,length,seed,npoints,nflagella;
double Lr0;
double radius,k0,kbend,dtaf,TEMP,gamma1,wave,frequency,wavelength,ylc,zlc;
double Rrbc,Mrbc,Irbc;
/********************************************/
//////////////////////////////////////////
double starttimempi,endtimempi,totaltimempi;
int rank,numprocs,left,right,false,true,xer,xsl;
MPI_Comm comm1d;
MPI_Status status;
////////////////////////////////////////////////////
char foutpoint[256] = "davod";
char foutpoint1[256] = "davoda";
char fname[256] = "davoda";
/********************************************/
unsigned long int Naf,tsim,NAF,classwidth,helix,flalen,Nsol,Nsolp,Nsolw,Nrbc,Nrbct,Nrbcp;
unsigned long int *N_monocell,cellsize,nprcell,svent;
double angle,SRTEMP,tottime,sangle,eps,totdt,inv_Naf;
double R2CM,R2,KE,PE,dt;
double centerlength,totforx,totfory,totforz,nfx,nfy,nfz,totvx,totvy,totvz,tottorx,tottory,tottorz;
double vsol2,wv,fr,TNF1,TNF2,TPF,TNV1,TNV2,TPV,avgspcur;
double kbody,kround,kcenben,knew,kcomp,tlength,inv_tlength,kb1,fr1,kmi;
double tbf,taf,vaddx,vaddy,vaddz,totangx,totangy,totangz,inv_npoints,reducedbend;
/*********************************************/
struct aftr *at;
struct CM *cm;
struct cnline *cnt;
struct sol *ss;
struct wallp *ww;
struct redcell *rbc;
struct cellVCM *N_VCM;
/*********************************************/
FILE *fp;
time_t date;
char name[50];
/*********************************/
void init(void);
void afststraight(void);
void aftrvel1(void);
void lenat0(void);
void normal1(void);
void restart(void);
void restartb(void);
void transverse(void);
void rbcpos(void);
void solventposvel1(void);
void wallpos(void);
void streaming(double);
void snapshot(void);
void snapshot1(void);
void radiuscal(void);
void bendbodyforcet0(void);
void insideaftr8(unsigned long int);
void bounceback(int,unsigned long int,double);
void bouncebackrbc(int,unsigned long int,int,double);
void ND(void);
void MDRBC(void);
double gaussianrandom(void);
void calculateforces(void);
void calculateroundspring(void);
void bodyspring(void);
void cenbenspring(void);
void bendbodyforce2(void);
void forcebend11(void);
void collisionAT(void);
void average(void);
void results(void);
void flalink(struct aftr*,struct aftr*);
void hellink(struct aftr*,struct aftr*);
void velupdate(double,double,double,double,double,double,unsigned long int,unsigned long int);
void velupdate2(unsigned long int,unsigned long int);
double rayleighrandom(void);
/*****************************************/
int main(int argc, char *argv[])
{
unsigned long int i,n;
double clt,mass;
//////////////////////parallel//////////////////////
// double starttimempi,endtimempi,totaltimempi;
// int rank,numprocs,left,right,false,true;
false=0;
true=1;
////////////////////////////////////////////////////
//////////////////////parallel/////////////////////
/// MPI_Comm comm1d;
// comm1d=MPI_COMM_WORLD;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Cart_create(MPI_COMM_WORLD,1,&numprocs,&true,true,&comm1d);
MPI_Comm_rank(comm1d,&rank);
MPI_Cart_shift(comm1d,0,1,&left,&right);
///////////////////////////////////////////////////
// printf("\n rank=%i numprocs=%i \n",rank, numprocs);
// starttimempi=MPI_Wtime();
/////////////////////////////////////////////////
/* if(argc!=20)
{
printf("PB arguments != 19\n");
exit(1);
}
*/
Lr1=18;
L=120;
seed=0;
length=26;
radius=1.0;
npoints=10;
nflagella=0;
k0=3000000.0;
kbend=50.0;
dtaf=0.0001;
TEMP=1.0;
tottime=100000.0;
gamma1=1.0;
wave=1;
helix=1;
dt=0.01;
nprcell=10;
svent=1;
frequency=-0.005;
wavelength=2.25;
if(wave>2 || wave<0)
{
printf("african trypanosome change wave\n");
exit(1);
}
if(helix>1 || helix<0)
{
printf("what change helix\n");
exit(1);
}
Lr0=(Lr1-2.5)/2.0;
zlc=(double)Lr1/2.0;
ylc=(double)Lr1/2.0;
xsl=rank*L/numprocs;
xer=(rank+1)*L/numprocs;
if(L%numprocs != 0 )
{
exit(1);
}
cellsize=1;
centerlength=1.;
NAF=1;
Nrbc=10000;
srand48(seed);
SRTEMP=sqrt(TEMP);
Naf=(length*(npoints));
flalen=length;
Nsol=nprcell*L*Lr1*Lr1;
Nsolp=nprcell*Lr1*Lr1*L/numprocs;
mass=1.;
inv_Naf=1./(double)Naf;
inv_npoints=1./(double)npoints;
angle=2.*PI/(double)npoints;
wv=wavelength*2.*PI/(centerlength*((double)length-1.));
fr=-2.*PI*frequency;
reducedbend=0.8;
knew=10.;
kb1=180.;
kcenben=1.;
kbody=1.;
kround=1.;
kcomp=0;
kmi=180.;
avgspcur=0;
if(rank==0){
fp=fopen("info.txt","w");
date=time(NULL);
fprintf(fp,"Created by %s at %s",argv[0],ctime(&date));
fprintf(fp,"knew=%le\tkb1=%le\tkcenben=%le\tkbody=%le\tkround=%le\tkcomp=%le\tkmi=%le\n",knew,kb1,kcenben,kbody,kround,kcomp,kmi);
fclose(fp);
}
sangle=sin(angle*0.5);
eps=10.;
totdt=classwidth=0;
init();
afststraight();
aftrvel1();
lenat0();
bendbodyforcet0();
tsim=0;
if(tsim != 0)
{
restart();
Rrbc=1.0;
Mrbc=100*nprcell*4*PI*Rrbc*Rrbc*Rrbc/3;
Irbc=2*Mrbc*Rrbc*Rrbc/5;
// restartb();
clt=totdt+dt;
}
// tsim++;
// snapshot1();
// tsim--;
normal1();
//transverse();
if(tsim == 0)
{
rbcpos();
solventposvel1();
streaming(dt);
snapshot();
//radiuscal();
//bendbodyforcet0();
tsim=totdt=classwidth=0;
clt=dt;
//tlength=sqrt(dist2((at+0)->xreal,(at+length-1)->xreal,(at+0)->yreal,(at+length-1)->yreal,(at+0)->zreal,(at+length-1)->zreal));
//inv_tlength=1./tlength;
}
R2CM=R2=KE=PE=totforx=totfory=totforz=totvx=totvy=totvz=TNF1=TNF2=TPF=TNV1=TNV2=TPV=tottorx=tottory=tottorz=taf=0;
totangx=totangy=totangz=0;
starttimempi=MPI_Wtime();
//exit(1);
do
{
tsim++;
ND();
// dt=dtaf;
// MDRBC();
if(totdt>clt)
{
dt=0.01;
//printf("rankkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk=%d tsim = %i\n",rank,tsim);
MDRBC();
//printf("rankkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk22222222222222=%d tsim = %i\n",rank,tsim);
normal1();
///transverse();
vaddx=vaddy=vaddz=0;
streaming(dt);
if(OBSM==1) MDRBC();
if(numprocs > 1){
MPI_Allreduce(&vaddx,&vaddx,1,MPI_DOUBLE,MPI_SUM,comm1d);
MPI_Allreduce(&vaddy,&vaddy,1,MPI_DOUBLE,MPI_SUM,comm1d);
MPI_Allreduce(&vaddz,&vaddz,1,MPI_DOUBLE,MPI_SUM,comm1d);
}
vaddx*=inv_Naf;
vaddy*=inv_Naf;
vaddz*=inv_Naf;
collisionAT();
clt+=dt;
}
/// results();
totdt+=dtaf;
classwidth++;
if(tsim%1000==0)
{
/// average();
classwidth=0;
}
if(rank==0 && tsim%1000==0) printf("rank=%d tsim = %i\n",rank,tsim);
if(tsim%150000==0)
snapshot();
if(tsim%5000000==0)
snapshot1();
}
while(totdt<=tottime);
//////////////////////////////////////
endtimempi=MPI_Wtime();
totaltimempi=endtimempi-starttimempi;
printf("rank=%d totaltimempi = %e\n",rank,totaltimempi);
//////////////////////////////////////
MPI_Finalize();
/////////////////////////////////////////////
return 0;
}
void init()
{
unsigned long int mem,AT,SRD;
double ppb,c,alpha;
at=(struct aftr *)calloc(Naf,sizeof(struct aftr));
cm=(struct CM *)calloc(NAF,sizeof(struct CM));
cnt=(struct cnline *)calloc(flalen,sizeof(struct cnline));
ss=(struct sol *)calloc(Nsolp*2,sizeof(struct sol));
ww=(struct wallp *)calloc(Nsolp,sizeof(struct wallp));
rbc=(struct redcell *)calloc(Nrbc,sizeof(struct redcell));
N_VCM=(struct cellVCM *)calloc(Lr1*Lr1*L/numprocs,sizeof(struct cellVCM));
N_monocell=(unsigned long int *)calloc(Lr1*Lr1*L/numprocs,sizeof(unsigned long int));
mem=0;
mem+=Naf*sizeof(struct aftr)+NAF*sizeof(struct CM)+flalen*sizeof(struct cnline)+Nsolp*sizeof(struct sol);
mem+=L*L*L*(sizeof(struct cellVCM)+2*sizeof(unsigned long int))+3*sizeof(double);
ppb=(double)(Naf+Nsol)/(double)(L*L*L);
c=ppb/(ppb-1.+exp(-ppb));
AT=1;
if(rank==0){
fp=fopen("info.txt","a");
fprintf(fp,"L=%ld\nseed=%ld\nlenght=%ld\tradius=%le\tnpoints=%ld\tNaf=%ld\nk0=%le\tkbend=%le\t",L,seed,length,radius,npoints,Naf,k0,kbend);
fprintf(fp,"gamma1=%le\n",gamma1);
fprintf(fp,"dt=%le\tdtaf=%le\n",dt,dtaf);
if(SRD==1)
{
fprintf(fp,"Nsol=%ld\tppb=%le\nkineticviscosity=%le\tcollisionviscosity=%le\t",Nsol,ppb,((5.*c/(2.-cos(alpha)-cos(2.*alpha)))-1.)*TEMP*0.5*dt,((1-cos(alpha))/(18.*c))*(double)(cellsize*cellsize)/dt,(TEMP*dt*(ppb/(ppb-1.+exp(-ppb))-0.5))+((ppb-1.+exp(-ppb))/(ppb*12.*dt)));
fprintf(fp,"totalvicosity=%le\n",(((5.*c/(2.-cos(alpha)-cos(2.*alpha)))-1.)*TEMP*0.5*dt)+(((1-cos(alpha))/(18.*c))*(double)(cellsize*cellsize)/dt));
}
if(AT==1)
{
fprintf(fp,"Nsol=%ld\tppb=%le\nkineticviscosity=%le\tcollisionviscosity=%le\t",Nsol,ppb,((ppb/(ppb-(5./4.)))-0.5)*TEMP*dt,cellsize*cellsize/(24.*dt)*((ppb-(7./5.))/ppb));
fprintf(fp,"totalvicosity=%le\n",(((ppb/(ppb-(5./4.)))-0.5)*TEMP*dt)+(cellsize*cellsize/(24.*dt)*((ppb-(7./5.))/ppb)));
}
fprintf(fp,"wavelenght=%le\tfrequency=%le\tavgspontaneouscurvature=%le\n",2*PI/wv,fr,avgspcur);
fprintf(fp,"\n\n");
if(helix==0)
{
if(wave==0)
fprintf(fp,"Straight flagella with longitudnal wave passing along the flagella\n");
if(wave==1)
fprintf(fp,"Straight flagella with transverse wave passing along the flagella\n");
if(wave==2)
fprintf(fp,"Straight flagella with helical wave passing along the flagella\n");
}
if(helix==1)
{
if(wave==0)
fprintf(fp,"Helical flagella with longitudnal wave passing along the flagella\n");
if(wave==1)
fprintf(fp,"Helical flagella with transverse wave passing along the flagella\n");
if(wave==2)
fprintf(fp,"Helical flagella with helical wave passing along the flagella\n");
}
fprintf(fp,"\n\n");
fprintf(fp,"Memory allocation (MB) : %lf\n",(double)mem/(double)(1024*1024));
fclose(fp);
fp=fopen("angle.dat","w");
fclose(fp);
fp=fopen("diffusion.dat","w");
fclose(fp);
fp=fopen("for-vel.dat","w");
fclose(fp);
fp=fopen("fvpp.dat","w");
fclose(fp);
fp=fopen("tor.dat","w");
fclose(fp);
fp=fopen("sol-vel.dat","w");
fclose(fp);
}
}
void afststraight()
{
unsigned long int i,j,k,j1,j2,n,n1;
double x,y,z,r,phi,c,s,d,l0,p,l,t1,t2,t3,rad,r2,ccc;
double e,r1,ll,coangle,la;
struct aftr *a,*a1,*a2;
k=rad=0;
phi=l=0;
t2=t3=(double)Lr1*0.5;
t1=(double)L*0.065;
for(j=0;j<npoints;j++)
{
s=sin(phi);
c=cos(phi);
i=l=ccc=0;
do
{
a=(at+k);
a->n=k;
// r=(0.16*(double)i+0.15)*pow((0.3*(double)i+2.5),0.13)*exp(-0.0115*((double)i+0.8)*((double)i+0.8));
// r=1.75*(0.165*(double)i/1.5+0.15)*pow((0.3*(double)i/1.9+2.5),0.13)*exp(-0.0115*((double)i/1.5+0.8)*((double)i/1.5+0.8));
if(i==0){
r=0.5*radius*pow(((double)i+0.15),0.25)*exp(-0.006*((double)i+0.15)*((double)i+0.15));
}
else if(i<21){
// r=radius*pow(((double)i+0.15),0.25)*exp(-0.006*((double)i+0.15)*((double)i+0.15));
r=radius*pow(((double)i-1.+0.15),0.25)*exp(-0.006*((double)i-1.+0.15)*((double)i-1.+0.15));
}
else{
r=r*0.95;
}
a->r=r;
a->mass=1.;
a->kbd=kbend;
if(r>rad)
rad=r;
if(i==0)
{
l=0;
}
else
{
// r1=(0.16*(double)i+0.15)*pow((0.3*(double)i+2.5),0.13)*exp(-0.0115*((double)i+0.8)*((double)i+0.8));
// r1=1.75*(0.165*(double)(i-1)/1.5+0.15)*pow((0.3*(double)(i-1)/1.9+2.5),0.13)*exp(-0.0115*((double)(i-1)/1.5+0.8)*((double)(i-1)/1.5+0.8));
if(i==1){
//r=0.5*radius*pow(((double)i+0.15),0.25)*exp(-0.006*((double)i+0.15)*((double)i+0.15));
r1=0.5*radius*pow(((double)i-1.+0.15),0.25)*exp(-0.006*((double)i-1.+0.15)*((double)i-1.+0.15));
}
else if(i<22){
r1=radius*pow(((double)i-2.+0.15),0.25)*exp(-0.006*((double)i-2.+0.15)*((double)i-2.+0.15));
}
else{
r1=r1*0.95;
}
l+=sqrt(centerlength*centerlength-(r-r1)*(r-r1));
if(i==1)
ll=l;
if(i>1)
(at+k)->D=l-ll;
}
a->bn=r;
x=(at+k)->xreal=(at+k)->x0=t1+l;
y=(at+k)->yreal=(at+k)->y0=t2+r*s;
z=(at+k)->zreal=(at+k)->z0=t3+r*c;
if(i>0)
{
coangle=acos(1.*((at+k-1)->xreal-(at+k)->xreal))*180./PI;
ccc+=sqrt(dist2((at+k-1)->xreal,(at+k)->xreal,(at+k-1)->yreal,(at+k)->yreal,(at+k-1)->zreal,(at+k)->zreal));
// printf("%le\t%le\t%le\t%le\n",l,sqrt(dist2((at+k-1)->xreal,(at+k)->xreal,(at+k-1)->yreal,(at+k)->yreal,(at+k-1)->zreal,(at+k)->zreal)),ccc,180.-coangle);
}
/////////////////////////////////////
if(x >= xsl && x < xer){
a->typ=0;
}
else if ( x < xsl && (xsl-x) < (2*(xer-xsl))){
a->typ=1;
}
else if ( x >= xer && (x-xer) < (2*(xer-xsl))){
a->typ=1;
}
else{
a->typ=2;
}
// printf(" %i\t%i\t%le\t%i\t%i\n",rank,a->typ,a->xreal,xsl,xer);
///////////////////////////////////////////
if(i>0)
{
a1=(at+(k-1));
flalink(a1,a);
flalink(a,a1);
}
i++;
k++;
}
while(i<length);
phi+=angle;
}
la=0.0;
j=1;
a=at+2;
for(i=2;i<length;i++)
{
if(i<8)
{
a1=at+i+1;
a->hl=sqrt(dist2(a->xreal,a1->xreal,a->yreal,a1->yreal,a->zreal,a1->zreal));
hellink(a1,a);
hellink(a,a1);
if(a->n+182>260)
{
a->n1=a->n+182-260;
a->n2=a->n+78;
}
else
{
a->n1=a->n+182;
a->n2=a->n+78;
}
// a->D=sqrt(dist2((at+1)->xreal,a->xreal,(at+1)->yreal,a->yreal,(at+1)->zreal,a->zreal));
// la+=sqrt(dist2(a2->xreal,a->xreal,a2->yreal,a->yreal,a2->zreal,a->zreal));
a->D=la;
la+=sqrt(dist2(a->xreal,a1->xreal,a->yreal,a1->yreal,a->zreal,a1->zreal));
// printf("%ld\t%ld\t%ld\t%ld\t%le\n",a->n2,a->n,a->n1,a1->n,a->D);
}
if(i==9 || i==10 || i==11 || i==12 )
{
a1=(at+i+j*length);
//a->hl=sqrt(dist2(a->xreal,a1->xreal,a->yreal,a1->yreal,a->zreal,a1->zreal));
hellink(a1,a);
hellink(a,a1);
if(a->n+182>260)
{
a->n1=a->n+182-260;
a->n2=a->n+78;
}
else
{
a->n1=a->n+182;
a->n2=a->n+78;
}
a->D=la;
la+=sqrt(dist2(a->xreal,a1->xreal,a->yreal,a1->yreal,a->zreal,a1->zreal));
// a->D=sqrt(dist2((at+1)->xreal,a->xreal,(at+1)->yreal,a->yreal,(at+1)->zreal,a->zreal));
j++;
// printf("%ld\t%ld\t%ld\t%ld\t%le\n",a->n2,a->n,a->n1,a1->n,a->D);
}
if(i>12)
{
a1=(at+i+j*length);
//a->hl=sqrt(dist2(a->xreal,a1->xreal,a->yreal,a1->yreal,a->zreal,a1->zreal));
hellink(a1,a);
hellink(a,a1);
if(a->n+182>260)
{
a->n1=a->n+182-260;
a->n2=a->n+78;
}
else
{
a->n1=a->n+182;
a->n2=a->n+78;
}
// a->D=sqrt(dist2((at+4)->xreal,a->xreal,(at+4)->yreal,a->yreal,(at+4)->zreal,a->zreal));
a->D=la;
la+=sqrt(dist2(a->xreal,a1->xreal,a->yreal,a1->yreal,a->zreal,a1->zreal));
// printf("%ld\t%ld\t%ld\t%ld\t%le\n",a->n2,a->n,a->n1,a1->n,a->D);
}
if(i<length-1)
a=a1;
}
if(k!=Naf)
{
printf("pb %ld \t %ld\n",k,Naf);
exit(1);
}
radius=rad;
}
void aftrvel1()
{
unsigned long int i,j;
double Vx,Vy,Vz,xcm,ycm,zcm,v2,inv_temp,temp;
struct aftr *a;
Vx=Vy=Vz=xcm=ycm=zcm=0;
for(i=0;i<Naf;i++)
{
a=at+i;
a->vx=gaussianrandom();
a->vy=gaussianrandom();
a->vz=gaussianrandom();
Vx+=a->vx;
Vy+=a->vy;
Vz+=a->vz;
}
Vx*=1./(double)Naf;
Vy*=1./(double)Naf;
Vz*=1./(double)Naf;
v2=0;
for(i=0;i<Naf;i++)
{
a=at+i;
a->vx-=Vx;
a->vy-=Vy;
a->vz-=Vz;
v2+=a->vx*a->vx+a->vy*a->vy+a->vz*a->vz;
xcm+=a->xreal;
ycm+=a->yreal;
zcm+=a->zreal;
}
(cm+0)->xreal=(cm+0)->xc0=xcm*inv_Naf;
(cm+0)->yreal=(cm+0)->yc0=ycm*inv_Naf;
(cm+0)->zreal=(cm+0)->zc0=zcm*inv_Naf;
temp=v2/3.*inv_Naf;
inv_temp=sqrt(TEMP/temp);
v2=0;
for(i=0;i<Naf;i++)
{
a=at+i;
a->vx*=inv_temp;
a->vy*=inv_temp;
a->vz*=inv_temp;
v2+=a->vx*a->vx+a->vy*a->vy+a->vz*a->vz;
}
printf("TEMP=%le\n",1./3.*v2/(double)Naf);
}
void lenat0()
{
unsigned long int i,j,k;
double dam1x,dam1y,dam1z,fx,fy,fz,l0,d2,d,inv_d;
struct aftr *a1,*a2,*a3,*a4;
/******************************************************/
for(i=0;i<length;i++)
{
k=i;
j=0;
do
{
if(j==0)
{
a1=(at+k);
a2=(at+k+length*(j+1));
}
else
{
a1=a2;
if(j<npoints-1)
a2=(at+k+length*(j+1));
else
a2=(at+k);
}
dam1x=(a1->xreal-a2->xreal);
dam1y=(a1->yreal-a2->yreal);
dam1z=(a1->zreal-a2->zreal);
a1->round=sqrt(dam1x*dam1x+dam1y*dam1y+dam1z*dam1z);
j++;
}
while(j<npoints);
}
/******************************************************/
i=0;
do
{
for(j=0;j<length-1;j++)
{
a1=at+(i)*length+j;
a2=at+(i)*length+j+1;
dam1x=(a1->xreal-a2->xreal);
dam1y=(a1->yreal-a2->yreal);
dam1z=(a1->zreal-a2->zreal);
a1->body=sqrt(dist2(a1->xreal,a2->xreal,a1->yreal,a2->yreal,a1->zreal,a2->zreal));
}
i++;
}
while(i<npoints);
/*if(nflagella==1)
{
a1=at+length-1;
a2=at+Naf-1;
a1->body=sqrt(dist2(a1->xreal,a2->xreal,a1->yreal,a2->yreal,a1->zreal,a2->zreal));
}*/
/******************************************************/
for(i=0;i<length;i++)
{
k=i;
j=0;
if(i==0)
l0=2.*radius*0.5;
else
l0=2./(double)i*radius;
do
{
a1=(at+(k+j*length));
a2=(at+k+length*(j+5));
a1->cenben=sqrt(dist2(a1->xreal,a2->xreal,a1->yreal,a2->yreal,a1->zreal,a2->zreal));
a2->cenben=sqrt(dist2(a1->xreal,a2->xreal,a1->yreal,a2->yreal,a1->zreal,a2->zreal));
j++;
}
while(j<npoints-5);
}
}
void normal1()
{
unsigned long int i,j,k,m,ki=0,kj=0;
double d2,d,inv_d;
double dax,day,daz,x1;
struct aftr *a1;
struct cnline *c;
////////////////////////////////
static double *hud; //////////////
static double *hvd; //////////////
static double *had; //////////////
static double *hbd; //////////////
static int n3st = 0;
if(n3st == 0){
hud = (double *) malloc(sizeof(double)*(5000));///////////////
if(hud == NULL){
printf("\n err_message(2)");/////////////////////
exit(1);
}
hvd = (double *) malloc(sizeof(double)*(5000));/////////////
if(hvd == NULL) exit(1);////////////////
had = (double *) malloc(sizeof(double)*(5000));/////////////////
if(had == NULL) exit(1);/////////////////////
hbd = (double *) malloc(sizeof(double)*(5000));////////////////
if(hbd == NULL) exit(1);///////////////////
n3st++;
}
hud[ki++] = 0.0;
hvd[kj++] = 0.0;
had[0] = 0.0;
hbd[0] = 0.0;
/////////////////////////////////////////
for(i=0;i<Naf;i++)
{
a1=at+i;
if(a1->typ != 0)continue;
x1=a1->xreal;
if( x1 >= xer || x1 < xsl)
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRR1 \n");
printf(" rank=%i i=%i a1->typ=%i a1->xreal=%le xsl=%i xer=%i \n",rank,i,a1->typ,a1->xreal,xsl,xer);
exit(1);
}
hvd[kj++]=(double)i;
hvd[kj++]=a1->vx;
hvd[kj++]=a1->vy;
hvd[kj++]=a1->vz;
// printf("rank=%i i=%i ax=%le ay=%le az=%le vx=%le \n",rank,i,a1->ax,a1->ay,a1->az,a1->vx);
hud[ki++]=(double)i;
hud[ki++]=a1->vx;
hud[ki++]=a1->vy;
hud[ki++]=a1->vz;
// printf("rank=%i i=%i ax=%le ay=%le az=%le vx=%le \n",rank,i,a1->ax,a1->ay,a1->az,a1->vx);
}
if(ki == 1) ki=0;
if(kj == 1) kj=0;
hud[0]=(double)ki;
hvd[0]=(double)kj;
//printf("rankmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm=%i kj=%i ki=%i \n",rank,kj,ki);
if(numprocs > 1){
MPI_Sendrecv(&hud[0],ki,MPI_DOUBLE,left,5,&had[0],5000,MPI_DOUBLE,right,5,comm1d,&status);
MPI_Sendrecv(&hvd[0],kj,MPI_DOUBLE,right,6,&hbd[0],5000,MPI_DOUBLE,left,6,comm1d,&status);
}
ki = (int)had[0];
kj = 1;
////printf("rankrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr=%i ki=%i \n",rank,ki);
while( kj < ki){
i=(int)had[kj++];
a1=at+i;
if( a1->typ != 1)
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRR2");
printf(" rank=%i i=%i a1->typ=%i a1->xreal=%le xsl=%i xer=%i \n",rank,i,a1->typ,a1->xreal,xsl,xer);
exit(1);
}
a1->vx=had[kj++];
a1->vy=had[kj++];
a1->vz=had[kj++];
//printf("rank=%i i=%i ax=%le ay=%le az=%le vx=%le \n",rank,i,a1->ax,a1->ay,a1->az,a1->vx);
// printf(" %i\t%i\t%i\t%le\t%i\t%i\n",ki,rank,a->typ,a->xreal,xsl,xer);
}
ki = (int)hbd[0];
kj = 1;
//printf("rankffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff=%i ki=%i \n",rank,ki);
while( kj < ki){
i=(int)hbd[kj++];
a1=at+i;
if( a1->typ != 1)
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRR3");
printf(" rank=%i i=%i a1->typ=%i a1->xreal=%le xsl=%i xer=%i \n",rank,i,a1->typ,a1->xreal,xsl,xer);
exit(1);
}
a1->vx=hbd[kj++];
a1->vy=hbd[kj++];
a1->vz=hbd[kj++];
// printf("rank=%i i=%i ax=%le ay=%le az=%le vx=%le \n",rank,i,a1->ax,a1->ay,a1->az,a1->vx);
}
for(i=0;i<Naf;i++)
{
a1=at+i;
if((a1->typ == 1) && (a1->xreal >= xsl) && (a1->xreal < xer))
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRR4");
printf(" rank=%i i=%i a1->typ=%i a1->xreal=%le xsl=%i xer=%i \n",rank,i,a1->typ,a1->xreal,xsl,xer);
exit(1);
}
if((a1->typ == 0) && ((a1->xreal < xsl) || (a1->xreal >= xer)))
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRR5");
printf(" rank=%i i=%i a1->typ=%i a1->xreal=%le xsl=%i xer=%i \n",rank,i,a1->typ,a1->xreal,xsl,xer);
exit(1);
}
}
for(i=0;i<length;i++)
{
a1=at+i;
if( a1->typ == 2)continue;
if(((a1->xreal) < (xer+1.4*(xer-xsl))) && ((a1->xreal) > (xsl-1.4*(xer-xsl))))
{
k=i;
j=0;
dax=day=daz=0;
c=cnt+i;
do
{
a1=(at+(k+(j*length)));
dax+=a1->xreal;
day+=a1->yreal;
daz+=a1->zreal;
//c->bspring[j]=a1->n;
a1->plane=k;
j++;
}
while(j<npoints);
dax*=inv_npoints;
day*=inv_npoints;
daz*=inv_npoints;
c->xreal=dax;
c->yreal=day;
c->zreal=daz;
c->radius=0;
c->radius2=0;
}
}
//exit(1);
for(i=1;i<length;i++)
{
a1=at+i;
if( a1->typ == 2)continue;
if((((cnt+i)->xreal) < (xer+(xer-xsl))) && (((cnt+i)->xreal) > (xsl-(xer-xsl))))
{
dax=(cnt+i-1)->xreal-(cnt+i)->xreal;
day=(cnt+i-1)->yreal-(cnt+i)->yreal;
daz=(cnt+i-1)->zreal-(cnt+i)->zreal;
inv_d=1./sqrt(dax*dax+day*day+daz*daz);
(cnt+i-1)->dirx=dax*inv_d;
(cnt+i-1)->diry=day*inv_d;
(cnt+i-1)->dirz=daz*inv_d;
if(i==length-1)
{
inv_d=1./sqrt(dax*dax+day*day+daz*daz);
(cnt+i)->dirx=dax*inv_d;
(cnt+i)->diry=day*inv_d;
(cnt+i)->dirz=daz*inv_d;
}
}
}
for(i=0;i<Naf;i++)
{
a1=at+i;
if(a1->xreal < (xsl-4)) a1->typ=2;
if(a1->xreal > (xer+4)) a1->typ=2;
}
for(i=0;i<(length*npoints);i++)
{
a1=at+i;
if(a1->typ == 2)continue;
c=cnt+a1->plane;
dax=c->xreal-a1->xreal;
day=c->yreal-a1->yreal;
daz=c->zreal-a1->zreal;
d=sqrt(dax*dax+day*day+daz*daz);
if(d>0)
{
inv_d=1./d;
a1->nx=-dax*inv_d;
a1->ny=-day*inv_d;
a1->nz=-daz*inv_d;
if(tsim==0)
{
a1->nx0=-dax*inv_d;
a1->ny0=-day*inv_d;
a1->nz0=-daz*inv_d;
//printf("%le\t%le\t%le\n",a1->xreal+a1->nx0,a1->yreal+a1->ny0,a1->zreal+a1->nz0);
}
if(d>c->radius)
{
c->radius2=dax*dax+day*day+daz*daz;
c->radius=d;
}
}
}
if(svent==1)
{
for(i=0;i<Naf;i++)
{
a1=at+i;
if(a1->typ == 2)continue;
a1->cx=a1->xreal;
a1->cy=a1->yreal;
a1->cz=a1->zreal;
//printf("%le\t%le\t%le\n",a1->cx,a1->cy,a1->cz);
}
for(i=0;i<length;i++)
{
c=cnt+i;
c->cx=c->xreal;
c->cy=c->yreal;
c->cz=c->zreal;
//printf("%le\t%le\t%le\n",a1->cx,a1->cy,a1->cz);
}
for(i=0;i<Naf;i++)
{
a1=at+i;
if(a1->xreal < (xsl-3)) a1->typ=2;
if(a1->xreal > (xer+3)) a1->typ=2;
}
}
//exit(1);
}
void rbcpos()
{
unsigned long int i,ii,j,n,ki,kj,il,idd;
int k;
double xl,yl,zl,rpc,dcp;
struct redcell *rc;
struct aftr *a;
///////////
static double *pu; ///////////////
static double *pra; //////////////
static int n1st = 0;
if(n1st == 0){
pu = (double *) malloc(sizeof(double)*(5000));////////////////
if(pu == NULL){
printf("\n err_message(1)");/////////////////////
exit(1);
}
pra = (double *) malloc(sizeof(double)*(5000));/////////////////
if(pra == NULL) exit(1);////////////parallel///////////
n1st++;
}
//////////
Nrbcp=0;
if(OBSTYP==0)
{
printf(" OBSTYP=%i\n",OBSTYP);
j=0;
i=0;
k=0;
n=0;
Nrbct=1650;
Rrbc=1.0;
Mrbc=100*nprcell*4*PI*Rrbc*Rrbc*Rrbc/3;
Irbc=2*Mrbc*Rrbc*Rrbc/5;
if(rank==0)
{
do
{
// xl=(double)xsl+drand48()*(double)(L/numprocs);
xl=drand48()*(double)L;
yl= drand48()*(double)Lr1;
zl= drand48()*(double)Lr1;
rpc=sqrt((yl-ylc)*(yl-ylc)+(zl-zlc)*(zl-zlc));
if( (rpc >= (Lr0-Rrbc)) || (xl <= 2*Rrbc) || (xl >= ((double)L-2*Rrbc)) ) continue; //
// if( (rank< 5 && rpc < (1.4+Rrbc)) || (rpc >= (Lr0-Rrbc)) || (xl <= (xsl-Rrbc)) || (xl >= (xer+Rrbc)) ) continue;
for(i=0;i<j;i++)
{
rc=rbc+i;
dcp=sqrt((xl-rc->xcm)*(xl-rc->xcm)+(yl-rc->ycm)*(yl-rc->ycm)+(zl-rc->zcm)*(zl-rc->zcm));
if(dcp <= 2.05*Rrbc) i=Nrbct+10;
}
for(ii=0;ii<Naf;ii++)
{
a=at+ii;
dcp=sqrt((xl-a->xreal)*(xl-a->xreal)+(yl-a->yreal)*(yl-a->yreal)+(zl-a->zreal)*(zl-a->zreal));
if(dcp <= 1.1*Rrbc) ii=Naf+10;
}
if(i < Nrbct+2 && ii< Naf+2)
{
rc=rbc+j;
rc->id=j;
rc->xcm=xl;
rc->ycm=yl;
rc->zcm=zl;
/* rc->xcm=15.0+j*10;
if(j < 5)
{
rc->ycm=11.0;
rc->zcm=10.0;
}
else
{
rc->ycm=8.0;
rc->zcm=8.0;
}*/
j++;
printf(" %i\t%i\t%i\t%le\t%le\t%le\n",rank,j,i,rc->xcm,rc->ycm,rc->zcm);
}
}
while(j< Nrbct);
for(i=0;i<Nrbct;i++)
{
rc=rbc+i;
printf(" %i\t%i\t%i\t%le\t%le\t%le\n",rank,j,i,rc->xcm,rc->ycm,rc->zcm);
}
}
for(k=1;k<numprocs;k++)
{
pu[0] = 0.0;
ki=1;
if(rank==0)
{
for(i=0;i<j;i++)
{
rc=rbc+i;
xl=rc->xcm;
if(xl >= (k*(L/numprocs)-Rrbc-0.5) && (xl <= ((k+1)*(L/numprocs)+Rrbc+0.5)) )
{
pu[ki++]=(double)rc->id;
pu[ki++]=rc->xcm;
pu[ki++]=rc->ycm;
pu[ki++]=rc->zcm;
}
}
if(ki == 1) ki=0;
pu[0]=(double)ki;
MPI_Send(&pu[0],ki,MPI_DOUBLE,k,k,MPI_COMM_WORLD);
}
if(rank==k)
{
MPI_Recv(&pra[0],5000,MPI_DOUBLE,0,rank,MPI_COMM_WORLD,&status);
ki = (int)pra[0];
kj = 1;
il=0;
while( kj < ki)
{
rc=rbc+il;
rc->id=(int)pra[kj++];
rc->xcm=pra[kj++];
rc->ycm=pra[kj++];
rc->zcm=pra[kj++];
il++;
}
Nrbcp=il;
}
}
if(rank==0)
{
il=0;
for(i=0;i<j;i++)
{
rc=rbc+i;
idd=rc->id;
xl=rc->xcm;
yl=rc->ycm;
zl=rc->zcm;
if( xl <= ((L/numprocs)+Rrbc+0.5) )
{
rc=rbc+il;
rc->id=idd;
rc->xcm=xl;
rc->ycm=yl;
rc->zcm=zl;
il++;
}
}
Nrbcp=il;
}
for(i=0;i<Nrbcp;i++)
{
rc=rbc+i;
rc->ip=0;
xl=rc->xcm;
if( (xl <= (xsl+Rrbc+0.5)) || (xl >= (xer-Rrbc-0.5)) )
{
rc->ip=1;
}
}
for(i=0;i<Nrbcp;i++)
{
rc=rbc+i;
rc->Vxcm=0.0;
rc->Vycm=0.0;
rc->Vzcm=0.0;
rc->wx=0.0;
rc->wy=0.0;
rc->wz=0.0;
rc->ex=1.0;
rc->ey=0.0;
rc->ez=0.0;
rc->Momx=0.0;
rc->Momy=0.0;
rc->Momz=0.0;
rc->Amomx=0.0;
rc->Amomy=0.0;
rc->Amomz=0.0;
printf(" %i\t%i\t%i\t%i\t%i\t%le\t%le\t%le\n",rank,Nrbcp,i,rc->id,rc->ip,rc->xcm,rc->ycm,rc->zcm);
}
}
}
void solventposvel1()
{
unsigned long int i,j,k,fsolvent,n;
double xl,yl,zl,v2,Vx,Vy,Vz,temp,inv_temp,rpw,rpc;
struct sol *p;
struct wallp *pw;
struct redcell *rc;
srand48(rank*100*Nsol);
i=0;
k=0;
j=0;
n=0;
do
{
xl=(double)xsl+drand48()*(double)(L/numprocs);
yl=drand48()*(double)Lr1;
zl=drand48()*(double)Lr1;
rpw=sqrt((yl-ylc)*(yl-ylc)+(zl-zlc)*(zl-zlc));
if(rpw > Lr0)
{
pw=ww+k;
pw->x=xl;
pw->y=yl;
pw->z=zl;
pw->n=k;
pw->vx=gaussianrandom();
pw->vy=gaussianrandom();
pw->vz=gaussianrandom();
k++;
}
else
{
rpc=100.0;
for(i=0;i<Nrbcp;i++)
{
rc=rbc+i;
if(rc->ip == 2)continue;
rpc=sqrt((xl-rc->xcm)*(xl-rc->xcm)+(yl-rc->ycm)*(yl-rc->ycm)+(zl-rc->zcm)*(zl-rc->zcm));
if(rpc<Rrbc)
{
//if(rank==0) printf(" %i\t%i\t%i\t%le\t%le\t%le\t%le\n",rank,Nrbcp,i,rc->xcm,rc->ycm,rc->zcm,rpc);
i=50000;
}
}
if(rpc < Rrbc)
{
pw=ww+k;
pw->x=xl;
pw->y=yl;
pw->z=zl;
pw->n=k;
pw->vx=gaussianrandom();
pw->vy=gaussianrandom();
pw->vz=gaussianrandom();
k++;
n++;
}
else
{
p=ss+j;
p->x=xl;
p->y=yl;
p->z=zl;
p->n=j;
j++;
}
}
}
while((j+k)<Nsolp);
Nsolp=j;
Nsolw=k;
printf("rank=%i nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnN=%i k=%i j=%i \n",rank,n,k,j);
v2=Vx=Vy=Vz=0;
for(i=0;i<Nsolp;i++)
{
p=ss+i;
p->vx=gaussianrandom();
p->vy=gaussianrandom();
p->vz=gaussianrandom();
if(i < 100) printf("rank=%i i=%i p->vx=%le \n",rank,i,p->vx);
Vx+=p->vx;
Vy+=p->vy;
Vz+=p->vz;
v2+=p->vx*p->vx+p->vy*p->vy+p->vz*p->vz;
}
printf("rank=%i Nsol=%i Nsolp=%i sol inside af solTEMP=%le\n",rank,Nsol,Nsolp,1./3.*v2/Nsolp);
//}
}
void wallpos()
{
unsigned long int i,j,k,n;
double xl,yl,zl,rpw,rpc;
double Vxrot,Vyrot,Vzrot,vsx,vsy,vsz;
struct wallp *pw;
struct redcell *rc;
k=0;
j=0;
n=0;
do
{
xl=(double)xsl-0.5+drand48()*((double)(L/numprocs)+1.0);
yl=drand48()*(double)Lr1;
zl=drand48()*(double)Lr1;
rpw=sqrt((yl-ylc)*(yl-ylc)+(zl-zlc)*(zl-zlc));
if(rpw > Lr0)
{
pw=ww+k;
pw->x=xl;
pw->y=yl;
pw->z=zl;
pw->n=k;
pw->vx=gaussianrandom();
pw->vy=gaussianrandom();
pw->vz=gaussianrandom();
k++;
}
else
{
rpc=100.0;
for(i=0;i<Nrbcp;i++)
{
rc=rbc+i;
if(rc->ip == 2)continue;
rpc=sqrt((xl-rc->xcm)*(xl-rc->xcm)+(yl-rc->ycm)*(yl-rc->ycm)+(zl-rc->zcm)*(zl-rc->zcm));
if(rpc<Rrbc)
{
//if(rank==0) printf(" %i\t%i\t%i\t%le\t%le\t%le\t%le\n",rank,Nrbcp,i,rc->xcm,rc->ycm,rc->zcm,rpc);
//////////
pw=ww+k;
pw->x=xl;
pw->y=yl;
pw->z=zl;
pw->n=k;
pw->vx=gaussianrandom();
pw->vy=gaussianrandom();
pw->vz=gaussianrandom();
if(OBSM==1)
{
Vxrot=crossx(rc->wx,rc->wy,rc->wz,(xl-rc->xcm),(yl-rc->ycm),(zl-rc->zcm));
Vyrot=crossy(rc->wx,rc->wy,rc->wz,(xl-rc->xcm),(yl-rc->ycm),(zl-rc->zcm));
Vzrot=crossz(rc->wx,rc->wy,rc->wz,(xl-rc->xcm),(yl-rc->ycm),(zl-rc->zcm));
pw->vx+=rc->Vxcm+Vxrot;
pw->vy+=rc->Vycm+Vyrot;
pw->vz+=rc->Vzcm+Vzrot;
}
k++;
n++;
i=50000;
}
}
}
j++;
}
while(j < ((Nsol/numprocs)+(Nsol/L)));
Nsolw=k;
//printf("rank=%i nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnN=%i k=%i j=%i \n",rank,n,k,j);
}
void streaming(double stime)
{
unsigned long int i,ic,j,out,n,ki=0,kj=0,k2=0,k3=0;
double xl,yl,zl,rnp,v2,x1,y1,z1,st,st1,rpc;
struct sol *srd;
struct redcell *rc;
/////////////////////////////
static double *hup;
static double *hvp;
static double *hap;
static double *hbp;
static int *savid;
static int n2st = 0;
if(n2st == 0){
hup = (double *) malloc(sizeof(double)*(600000));
if(hup == NULL){
printf("\n err_message(2)");
exit(1);
}
hvp = (double *) malloc(sizeof(double)*(600000));
if(hvp == NULL) exit(1);/////////
hap = (double *) malloc(sizeof(double)*(600000));
if(hap == NULL) exit(1);/////////
hbp = (double *) malloc(sizeof(double)*(600000));
if(hbp == NULL) exit(1);/////////
savid = (int *) malloc(sizeof(int)*(200000));
if(savid == NULL) exit(1);//////////
savid[0]=1;
n2st++;
}
// MPI_Status status;
hup[ki++] = 0.0;
hvp[kj++] = 0.0;
hap[0] = 0.0;
hbp[0] = 0.0;
k2=savid[0];
/////////////////////////////////////////
//printf("ranka=%i k2=%i savid[0]=%i kj=%i ki=%i \n",rank,k2,savid[0],kj,ki);
v2=0;
for(i=0;i<Nsolp;i++)
{
srd=ss+i;
///////////////////////////////
xl=srd->x;
if(xl < -1000)
continue;
//////////////////////////////////////////
srd->in=0;
out=j=0;
st1=st=stime;
do
{
xl=srd->x+srd->vx*st;
yl=srd->y+srd->vy*st;
zl=srd->z+srd->vz*st;
///printf("rank=%i n=%i x=%le y=%le z=%le xc=%le yc=%le zc=%le r2=%le radius2=%le \n",rank,srd->n,xl,yl,zl,(cnt+length-1)->cx,(cnt+length-1)->cy,(cnt+length-1)->cz,r2,(cnt+length-1)->radius2);
if(numprocs == 1){
if(xl<0)
xl+=(double)L;
if(xl>=(double)L)
xl-=(double)L;
}
/*
if(yl<0)
yl+=(double)L;
if(yl>=(double)L)
yl-=(double)L;
if(zl<0)
zl+=(double)L;
if(zl>=(double)L)
zl-=(double)L;
*/
srd->x=xl;
srd->y=yl;
srd->z=zl;
if(j<10)
{
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
rpc=sqrt((xl-rc->xcm)*(xl-rc->xcm)+(yl-rc->ycm)*(yl-rc->ycm)+(zl-rc->zcm)*(zl-rc->zcm));
if(rpc<Rrbc)
{
// if(rank==0) printf(" %i\t%i\t%i\t%le\t%le\t%le\t%le\n",rank,Nrbcp,i,rc->xcm,rc->ycm,rc->zcm,rpc);
bouncebackrbc(0,i,ic,st);
ic=50000;
}
}
}
////////////////////
//insideaftr8(srd->n);
// yl=srd->y;
// zl=srd->z;
rnp=sqrt((yl-ylc)*(yl-ylc)+(zl-zlc)*(zl-zlc));
if(rnp > Lr0)
{
bounceback(0,i,st);
}
j++;
insideaftr8(srd->n);
/* if(srd->in != 0 && tsim == 0)
{
srd->x=-2000.0;
srd->in==0;
printf("ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE rank=%i i=%i \n",rank,i);
}
*/
st1*=0.5;
st=st1;
if(srd->in==0 || j>20)
out=1;
}
while(out==0);
if((srd->x > xer+2) || (srd->x < xsl-2))
{
printf("EEEEEEEEEEEEEEEEEEEEEEEEEERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOORRRRRRRR rank=%i i=%i \n",rank,i);
srd->x=-2000.0;
continue;
}
yl=srd->y;
zl=srd->z;
rnp=sqrt((yl-ylc)*(yl-ylc)+(zl-zlc)*(zl-zlc));
if(rnp > (Lr0+0.2))
{
printf("EEEEEEEEEEEEEEERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOORRRRRRRR rank=%i i=%i \n",rank,i);
srd->x=-2000.0;
continue;
}
//if(j > 1) printf("rank=%i j=%i \n",rank,j);
/////////////////////////////////////////
//k2=1;//savid[0];
if(srd->x >= xer){
hvp[kj++]=srd->x;
hvp[kj++]=srd->y;
hvp[kj++]=srd->z;
hvp[kj++]= srd->vx;
hvp[kj++]= srd->vy;
hvp[kj++]= srd->vz;
savid[k2++]=srd->n;
srd->x=-2000.0;
}
else if(srd->x < xsl){
hup[ki++]=srd->x;
hup[ki++]=srd->y;
hup[ki++]=srd->z;
hup[ki++]= srd->vx;
hup[ki++]= srd->vy;
hup[ki++]= srd->vz;
savid[k2++]=srd->n;
srd->x=-2000.0;
}
/////////////////////////////////////////////////////
}
savid[0]=k2;
if(ki == 1) ki=0;
if(kj == 1) kj=0;
hup[0]=(double)ki;
hvp[0]=(double)kj;
if(numprocs > 1){
MPI_Sendrecv(&hup[0],ki,MPI_DOUBLE,left,3,&hap[0],600000,MPI_DOUBLE,right,3,comm1d,&status);
MPI_Sendrecv(&hvp[0],kj,MPI_DOUBLE,right,4,&hbp[0],600000,MPI_DOUBLE,left,4,comm1d,&status);
}
ki = (int)hap[0];
kj = 1;
k3=1;
while( kj < ki){
if(k3 < savid[0]){
j = savid[k3++];
}
else{
j = Nsolp ;
Nsolp++;
printf("rank=%i Nsolp=%i savid[0]=%i \n",rank,Nsolp,savid[0]);
}
if(j < 0)
{
printf("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOORRRRRRRR rank=%i j=%i \n",rank,j);
exit(1);
}
srd=ss+j;
srd->n=j;
srd->x=hap[kj++];
if(rank==numprocs-1) srd->x+=(double)L;
srd->y=hap[kj++];
srd->z=hap[kj++];
srd->vx=hap[kj++];
srd->vy=hap[kj++];
srd->vz=hap[kj++];
}
ki = (int)hbp[0];
kj = 1;
while( kj < ki){
if(k3 < savid[0] ){
j = savid[k3++];
}
else{
j = Nsolp ;
Nsolp++;
printf("rank1111111=%i Nsolp=%i savid[0]=%i \n",rank,Nsolp,savid[0]);
}
if(j < 0)
{
printf("2222222222EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOORRRRRRRR rank=%i j=%i \n",rank,j);
exit(1);
}
srd=ss+j;
srd->n=j;
srd->x=hbp[kj++];
if(rank == 0) srd->x-=(double)L;
srd->y=hbp[kj++];
srd->z=hbp[kj++];
srd->vx=hbp[kj++];
srd->vy=hbp[kj++];
srd->vz=hbp[kj++];
}
j=1;
for(i=k3;i< savid[0];i++)
{
savid[j++]=savid[i];
}
savid[0]=j;
for(i=0;i<Nsolp;i++)
{
srd=ss+i;
/////////////////////////parallel///////////
xl=srd->x;
if(xl < -1000)
continue;
if(xl < 0 || srd->y < 0 || srd->z < 0 || xl >= L || srd->y >= L || srd->z >= L )
{
printf("EEEEEEEEEEEEEEEEEEEEERRRRRRRRRRRRRRRRRRRRRRRROOOOOOORRRRRRRR rank=%i xl=%le \n",rank,xl);
exit(1);
}
if(xl < xsl || xl >= xer)
{
printf("EEEEEEEEEEEEEEEEEEEEERRRRRRRRRRRRRRRRRRRRRRRROOOOOOORRRRRRRR11111111 rank=%i i=%i xl=%le \n",rank,i,xl);
exit(1);
}
}
}
void bounceback(int k ,unsigned long int n, double st)
{
double x1,y1,z1,ey,ez,r,d,r2;
struct sol *srd;
struct aftr *a;
if(k == 0)
{
srd=ss+n;
x1=srd->x;
y1=srd->y;
z1=srd->z;
if(st < 0.001)
{
///printf("EEEEERRRRRRROOOOOOORRRRRRRRRRRRRRdt rank=%ld x=%le y=%le z=%le tsim=%ld n=%ld st=%le \n",rank,x1,y1,z1,tsim,n,st);
}
x1=x1-srd->vx*st*0.5;
y1=y1-srd->vy*st*0.5;
z1=z1-srd->vz*st*0.5;
r=sqrt((y1-ylc)*(y1-ylc)+(z1-zlc)*(z1-zlc));
d=Lr0-r;
ey=(y1-ylc)/r;
ez=(z1-zlc)/r;
y1=y1+d*ey;
z1=z1+d*ez;
srd->vx=-srd->vx;
srd->vy=-srd->vy;
srd->vz=-srd->vz;
srd->x=x1+srd->vx*st*0.5;
srd->y=y1+srd->vy*st*0.5;
srd->z=z1+srd->vz*st*0.5;
}
else if(k ==1)
{
if(st > 0.001)
{
printf("EEEEERRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOOOOOOOOOOOOOOOORRRRRRRRRRRRRRRRdt tsim=%ld n=%ld st=%le \n",tsim,n,st);
exit(1);
}
a=at+n;
x1=a->xreal;
y1=a->yreal;
z1=a->zreal;
x1=x1-a->vx*st*0.5;
y1=y1-a->vy*st*0.5;
z1=z1-a->vz*st*0.5;
r=sqrt((y1-ylc)*(y1-ylc)+(z1-zlc)*(z1-zlc));
d=Lr0-r;
ey=(y1-ylc)/r;
ez=(z1-zlc)/r;
y1=y1+d*ey;
z1=z1+d*ez;
a->vx=a->vx;
a->vy=-a->vy;
a->vz=-a->vz;
a->xreal=x1+a->vx*st*0.5;
a->yreal=y1+a->vy*st*0.5;
a->zreal=z1+a->vz*st*0.5;
}
}
void bouncebackrbc(int k ,unsigned long int n,int ic, double st)
{
double x1,y1,z1,ex,ey,ez,r,d,r2;
double Vxrot,Vyrot,Vzrot,vsx,vsy,vsz;
struct sol *srd;
struct aftr *a;
struct redcell *rc;
if(k == 0)
{
srd=ss+n;
x1=srd->x;
y1=srd->y;
z1=srd->z;
x1=x1-srd->vx*st*0.5;
y1=y1-srd->vy*st*0.5;
z1=z1-srd->vz*st*0.5;
rc=rbc+ic;
if(OBSTYP==0)
{
r=sqrt((x1-rc->xcm)*(x1-rc->xcm)+(y1-rc->ycm)*(y1-rc->ycm)+(z1-rc->zcm)*(z1-rc->zcm));
d=Rrbc-r;
ex=(x1-rc->xcm)/r;
ey=(y1-rc->ycm)/r;
ez=(z1-rc->zcm)/r;
x1=x1+d*ex;
y1=y1+d*ey;
z1=z1+d*ez;
if(OBSM==0)
{
srd->vx=-srd->vx;
srd->vy=-srd->vy;
srd->vz=-srd->vz;
}
else if(OBSM==1)
{
Vxrot=crossx(rc->wx,rc->wy,rc->wz,(x1-rc->xcm),(y1-rc->ycm),(z1-rc->zcm));
Vyrot=crossy(rc->wx,rc->wy,rc->wz,(x1-rc->xcm),(y1-rc->ycm),(z1-rc->zcm));
Vzrot=crossz(rc->wx,rc->wy,rc->wz,(x1-rc->xcm),(y1-rc->ycm),(z1-rc->zcm));
vsx=srd->vx;
vsy=srd->vy;
vsz=srd->vz;
srd->vx=-srd->vx+rc->Vxcm+Vxrot;
srd->vy=-srd->vy+rc->Vycm+Vyrot;
srd->vz=-srd->vz+rc->Vzcm+Vzrot;
rc->Momx+=srd->vx-vsx;
rc->Momy+=srd->vy-vsy;
rc->Momz+=srd->vz-vsz;
rc->Amomx+=crossx((x1-rc->xcm),(y1-rc->ycm),(z1-rc->zcm),(srd->vx-vsx),(srd->vy-vsy),(srd->vz-vsz));
rc->Amomy+=crossy((x1-rc->xcm),(y1-rc->ycm),(z1-rc->zcm),(srd->vx-vsx),(srd->vy-vsy),(srd->vz-vsz));
rc->Amomz+=crossz((x1-rc->xcm),(y1-rc->ycm),(z1-rc->zcm),(srd->vx-vsx),(srd->vy-vsy),(srd->vz-vsz));
}
srd->x=x1+srd->vx*st*0.5;
srd->y=y1+srd->vy*st*0.5;
srd->z=z1+srd->vz*st*0.5;
//r2=sqrt((srd->x-rc->xcm)*(srd->x-rc->xcm)+(srd->y-rc->ycm)*(srd->y-rc->ycm)+(srd->z-rc->zcm)*(srd->z-rc->zcm));
//if(rank==0) printf(" %i\t%i\t%i\t%le\t%le\t%le\t%le\n",rank,Nrbcp,n,rc->xcm,rc->ycm,rc->zcm,r2);
}
}
else if(k == 1)
{
a=at+n;
x1=a->xreal;
y1=a->yreal;
z1=a->zreal;
x1=x1-a->vx*st*0.5;
y1=y1-a->vy*st*0.5;
z1=z1-a->vz*st*0.5;
rc=rbc+ic;
if(OBSTYP==0)
{
r=sqrt((x1-rc->xcm)*(x1-rc->xcm)+(y1-rc->ycm)*(y1-rc->ycm)+(z1-rc->zcm)*(z1-rc->zcm));
d=Rrbc-r;
ex=(x1-rc->xcm)/r;
ey=(y1-rc->ycm)/r;
ez=(z1-rc->zcm)/r;
x1=x1+d*ex;
y1=y1+d*ey;
z1=z1+d*ez;
if(OBSM==0)
{
a->vx=a->vx;
a->vy=-a->vy;
a->vz=-a->vz;
}
else if(OBSM==1)
{
Vxrot=crossx(rc->wx,rc->wy,rc->wz,(x1-rc->xcm),(y1-rc->ycm),(z1-rc->zcm));
Vyrot=crossy(rc->wx,rc->wy,rc->wz,(x1-rc->xcm),(y1-rc->ycm),(z1-rc->zcm));
Vzrot=crossz(rc->wx,rc->wy,rc->wz,(x1-rc->xcm),(y1-rc->ycm),(z1-rc->zcm));
vsx=a->vx;
vsy=a->vy;
vsz=a->vz;
a->vx=a->vx+rc->Vxcm+Vxrot;
a->vy=-a->vy+rc->Vycm+Vyrot;
a->vz=-a->vz+rc->Vzcm+Vzrot;
rc->Momx+=a->vx-vsx;
rc->Momy+=a->vy-vsy;
rc->Momz+=a->vz-vsz;
rc->Amomx+=crossx((x1-rc->xcm),(y1-rc->ycm),(z1-rc->zcm),(a->vx-vsx),(a->vy-vsy),(a->vz-vsz));
rc->Amomy+=crossy((x1-rc->xcm),(y1-rc->ycm),(z1-rc->zcm),(a->vx-vsx),(a->vy-vsy),(a->vz-vsz));
rc->Amomz+=crossz((x1-rc->xcm),(y1-rc->ycm),(z1-rc->zcm),(a->vx-vsx),(a->vy-vsy),(a->vz-vsz));
}
a->xreal=x1+a->vx*st*0.5;
a->yreal=y1+a->vy*st*0.5;
a->zreal=z1+a->vz*st*0.5;
// r2=sqrt((a->xreal-rc->xcm)*(a->xreal-rc->xcm)+(a->yreal-rc->ycm)*(a->yreal-rc->ycm)+(a->zreal-rc->zcm)*(a->zreal-rc->zcm));
// printf(" %i\t%i\t%i\t%le\t%le\t%le\t%le\n",rank,Nrbcp,n,rc->xcm,rc->ycm,rc->zcm,r2);
}
}
}
void insideaftr8(unsigned long int n)
{
unsigned long int i,w1,w2;
double x1,y1,z1,d2,r2,inv_d;
double nx,ny,nz,tx1,ty1,tz1,dsmall,ds1;
double r,rm1,rp1,dirvec,trvx,trvy,trvz,scalar;
struct sol *srd;
struct cnline *c;
struct aftr *a,*a1;
srd=ss+n;
srd->in=0;
w1=5000;
dsmall=30.;
for(i=0;i<length;i++)
{
a1=at+i;
if(a1->typ == 2 )continue;
d2=dist2(a1->cx,srd->x,a1->cy,srd->y,a1->cz,srd->z);
if(d2<dsmall)
{
x1=srd->x;
y1=srd->y;
z1=srd->z;
w1=i;
dsmall=d2;
}
}
w2=Naf+2;
if(w1<length)
{
ds1=30.;
for(i=0;i<Naf;i++)
{
a1=at+i;
if(a1->typ == 2)continue;
d2=dist2(a1->cx,x1,a1->cy,y1,a1->cz,z1);
if(d2<ds1 && d2<6.)
{
ds1=d2;
w2=i;
a=at+w2;
scalar=a->nx*(a->cx-x1)+a->ny*(a->cy-y1)+a->nz*(a->cz-z1);
/// scalar1=a->nx*(srd->vx-a->vx)+a->ny*(srd->vy-a->vy)+a->nz*(srd->vz-a->vz);
}
}
}
//if((w2>24 && w2<30) || (w2>54 && w2<60) || (w2>84 && w2<90) || (w2>114 && w2<120) || (w2>144 && w2<150) || (w2>174 && w2<180) || (w2>204 && w2<210)) w2=2000;
//if((w2>234 && w2<240) || (w2>264 && w2<270) || (w2>294 && w2<300)) w2=2000;
if(w2<Naf && scalar>0)
{
a=at+w2;
//printf("%le\t%le\t%le\t",x1,y1,z1);
if(a->plane!=0 && a->plane!=length-1)
{
trvx=(cnt+a->plane)->dirx;
trvy=(cnt+a->plane)->diry;
trvz=(cnt+a->plane)->dirz;
dirvec=trvx*(a->cx-x1)+trvy*(a->cy-y1)+trvz*(a->cz-z1);
if(dirvec<0)
{
r=(cnt+a->plane)->radius;
rm1=(cnt+(at+w2-1)->plane)->radius;
if(r-rm1<0)
{
nx=(at+w2-1)->nx;
ny=(at+w2-1)->ny;
nz=(at+w2-1)->nz;
scalar=nx*((at+w2-1)->cx-x1)+ny*((at+w2-1)->cy-y1)+nz*((at+w2-1)->cz-z1);
srd->x=x1+nx*scalar;
srd->y=y1+ny*scalar;
srd->z=z1+nz*scalar;
velupdate2(a->n,srd->n);
return;
}
else
{
nx=a->nx;
ny=a->ny;
nz=a->nz;
scalar=a->nx*(a->cx-x1)+a->ny*(a->cy-y1)+a->nz*(a->cz-z1);
srd->x=x1+nx*scalar;
srd->y=y1+ny*scalar;
srd->z=z1+nz*scalar;
velupdate2(a->n,srd->n);
return;
}
}
else
{
r=(cnt+a->plane)->radius;
rp1=(cnt+(at+w2+1)->plane)->radius;
if(r-rp1<0)
{
nx=(at+w2+1)->nx;
ny=(at+w2+1)->ny;
nz=(at+w2+1)->nz;
scalar=nx*((at+w2+1)->cx-x1)+ny*((at+w2+1)->cy-y1)+nz*((at+w2+1)->cz-z1);
srd->x=x1+nx*scalar;
srd->y=y1+ny*scalar;
srd->z=z1+nz*scalar;
velupdate2(a->n,srd->n);
return;
}
else
{
nx=a->nx;
ny=a->ny;
nz=a->nz;
scalar=a->nx*(a->cx-x1)+a->ny*(a->cy-y1)+a->nz*(a->cz-z1);
srd->x=x1+nx*scalar;
srd->y=y1+ny*scalar;
srd->z=z1+nz*scalar;
velupdate2(a->n,srd->n);
return;
}
}
}
if(a->plane==0)
{
trvx=(cnt+a->plane)->dirx;
trvy=(cnt+a->plane)->diry;
trvz=(cnt+a->plane)->dirz;
dirvec=trvx*(a->cx-x1)+trvy*(a->cy-y1)+trvz*(a->cz-z1);
if(dirvec>0)
{
nx=(at+w2+1)->nx;
ny=(at+w2+1)->ny;
nz=(at+w2+1)->nz;
scalar=nx*((at+w2+1)->cx-x1)+ny*((at+w2+1)->cy-y1)+nz*((at+w2+1)->cz-z1);
srd->x=x1+nx*scalar;
srd->y=y1+ny*scalar;
srd->z=z1+nz*scalar;
velupdate2(a->n,srd->n);
return;
}
else
{
r2=dist2((cnt+0)->cx,x1,(cnt+0)->cy,y1,(cnt+0)->cz,z1);
if(r2<(cnt+0)->radius2)
{
nx=x1-(cnt+0)->cx;
ny=y1-(cnt+0)->cy;
nz=z1-(cnt+0)->cz;
inv_d=1./sqrt(nx*nx+ny*ny+nz*nz);
nx*=inv_d;
ny*=inv_d;
nz*=inv_d;
tx1=crossx(nx,ny,nz,((cnt+0)->cx-a->cx),((cnt+0)->cy-a->cy),((cnt+0)->cz-a->cz));
ty1=crossy(nx,ny,nz,((cnt+0)->cx-a->cx),((cnt+0)->cy-a->cy),((cnt+0)->cz-a->cz));
tz1=crossz(nx,ny,nz,((cnt+0)->cx-a->cx),((cnt+0)->cy-a->cy),((cnt+0)->cz-a->cz));
inv_d=1./sqrt(tx1*tx1+ty1*ty1+tz1*tz1);
tx1*=inv_d;
ty1*=inv_d;
tz1*=inv_d;
r=sqrt(r2);
rm1=(cnt+0)->radius-r;
if(r>1.e-6)
{
inv_d=1./r;
srd->x=((cnt+0)->radius*x1-rm1*(cnt+0)->cx)*inv_d;
srd->y=((cnt+0)->radius*y1-rm1*(cnt+0)->cy)*inv_d;
srd->z=((cnt+0)->radius*z1-rm1*(cnt+0)->cz)*inv_d;
}
else
{
r=1.e-6;
rp1=(cnt+0)->radius-r;
inv_d=1./r;
srd->x=((cnt+0)->radius*x1-rp1*(cnt+0)->cx)*inv_d;
srd->y=((cnt+0)->radius*y1-rp1*(cnt+0)->cy)*inv_d;
srd->z=((cnt+0)->radius*z1-rp1*(cnt+0)->cz)*inv_d;
}
velupdate(nx,ny,nz,tx1,ty1,tz1,a->n,srd->n);
return;
}
}
}
if(a->plane==length-1)
{
trvx=(cnt+a->plane)->dirx;
trvy=(cnt+a->plane)->diry;
trvz=(cnt+a->plane)->dirz;
dirvec=trvx*(a->cx-x1)+trvy*(a->cy-y1)+trvz*(a->cz-z1);
if(dirvec<0)
{
nx=(at+w2-1)->nx;
ny=(at+w2-1)->ny;
nz=(at+w2-1)->nz;
scalar=nx*((at+w2-1)->cx-x1)+ny*((at+w2-1)->cy-y1)+nz*((at+w2-1)->cz-z1);
srd->x=x1+nx*scalar;
srd->y=y1+ny*scalar;
srd->z=z1+nz*scalar;
velupdate2(a->n,srd->n);
return;
}
else
{
r2=dist2((cnt+length-1)->cx,x1,(cnt+length-1)->cy,y1,(cnt+length-1)->cz,z1);
if(r2<(cnt+length-1)->radius2)
{
nx=x1-(cnt+length-1)->cx;
ny=y1-(cnt+length-1)->cy;
nz=z1-(cnt+length-1)->cz;
inv_d=1./sqrt(nx*nx+ny*ny+nz*nz);
nx*=inv_d;
ny*=inv_d;
nz*=inv_d;
tx1=crossx(nx,ny,nz,((cnt+length-1)->cx-a->cx),((cnt+length-1)->cy-a->cy),((cnt+length-1)->cz-a->cz));
ty1=crossy(nx,ny,nz,((cnt+length-1)->cx-a->cx),((cnt+length-1)->cy-a->cy),((cnt+length-1)->cz-a->cz));
tz1=crossz(nx,ny,nz,((cnt+length-1)->cx-a->cx),((cnt+length-1)->cy-a->cy),((cnt+length-1)->cz-a->cz));
inv_d=1./sqrt(tx1*tx1+ty1*ty1+tz1*tz1);
tx1*=inv_d;
ty1*=inv_d;
tz1*=inv_d;
r=sqrt(r2);
rp1=(cnt+length-1)->radius-r;
if(r>1.e-6)
{
inv_d=1./r;
srd->x=((cnt+length-1)->radius*x1-rp1*(cnt+length-1)->cx)*inv_d;
srd->y=((cnt+length-1)->radius*y1-rp1*(cnt+length-1)->cy)*inv_d;
srd->z=((cnt+length-1)->radius*z1-rp1*(cnt+length-1)->cz)*inv_d;
}
else
{
r=1.e-6;
rp1=(cnt+length-1)->radius-r;
inv_d=1./r;
srd->x=((cnt+length-1)->radius*x1-rp1*(cnt+length-1)->cx)*inv_d;
srd->y=((cnt+length-1)->radius*y1-rp1*(cnt+length-1)->cy)*inv_d;
srd->z=((cnt+length-1)->radius*z1-rp1*(cnt+length-1)->cz)*inv_d;
}
velupdate(nx,ny,nz,tx1,ty1,tz1,a->n,srd->n);
return;
}
}
}
}
}
void restartb()
{
unsigned long int i,j,ic,ki,kj,pj;
double xl,yl,zl,eps;
struct redcell *rc;
static double *drhv; //////////////
static double *drhb; /////////////
static double *drhu; ////////////
static double *drha; ////////
static int n410st = 0;
if(n410st == 0){
drhv = (double *) malloc(sizeof(double)*(5000));//////////////
if(drhv == NULL) exit(1);////////////
drhb = (double *) malloc(sizeof(double)*(5000));///////////////
if(drhb == NULL) exit(1);////////////
drhu = (double *) malloc(sizeof(double)*(5000));///////////////
if(drhu == NULL) exit(1);/////////////
drha = (double *) malloc(sizeof(double)*(5000));///////////////
if(drha == NULL) exit(1);///////////
n410st++;
}
j=rank*500;
eps=0.0000000005;
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
rc->ip = 2;
}
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if((rc->xcm > xsl+Rrbc+0.5) && (rc->xcm < xer-Rrbc-0.5) )
{
rc->ip = 0;
rc->id=j;
j++;
}
}
kj=0;
drhv[kj++] = 0.0;
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->xcm >= xer-Rrbc-0.5)
{
rc->ip = 1;
rc->id=j;
drhv[kj++]=(double)rc->id;
drhv[kj++]=rc->xcm;
drhv[kj++]=rc->ycm;
drhv[kj++]=rc->zcm;
j++;
}
}
if(kj == 1) kj=0;
drhv[0]=(double)kj;
drhb[0] = 0.0;
if(numprocs > 1){
MPI_Sendrecv(&drhv[0],kj,MPI_DOUBLE,right,199,&drhb[0],5000,MPI_DOUBLE,left,199,comm1d,&status);
}
ki = (int)drhb[0];
kj = 1;
pj=0;
drhu[pj++] = 0.0;
while( kj < ki){
i=(int)drhb[kj++];
xl=drhb[kj++];
yl=drhb[kj++];
zl=drhb[kj++];
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if((rc->xcm > (xl-eps)) && (rc->xcm < (xl+eps)) && (rc->ycm > (yl-eps)) && (rc->ycm < (yl+eps)) && (rc->zcm > (zl-eps)) && (rc->zcm < (zl+eps)) && rc->xcm <= xsl+Rrbc+0.5)
{
rc->ip = 1;
rc->id = i;
ic=Nrbcp+10;
}
}
if(ic < Nrbcp+3)
{
drhu[pj++]=xl;
drhu[pj++]=yl;
drhu[pj++]=zl;
}
}
if(pj == 1) pj=0;
drhu[0]=(double)pj;
drha[0] = 0.0;
if(numprocs > 1){
MPI_Sendrecv(&drhu[0],pj,MPI_DOUBLE,left,201,&drha[0],5000,MPI_DOUBLE,right,201,comm1d,&status);
}
ki = (int)drha[0];
kj = 1;
while( kj < ki){
xl=drha[kj++];
yl=drha[kj++];
zl=drha[kj++];
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if((rc->xcm > (xl-eps)) && (rc->xcm < (xl+eps)) && (rc->ycm > (yl-eps)) && (rc->ycm < (yl+eps)) && (rc->zcm > (zl-eps)) && (rc->zcm < (zl+eps)))
{
rc->ip = 2;
}
}
}
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
rc->Vxcm=0.0;
rc->Vycm=0.0;
rc->Vzcm=0.0;
rc->wx=0.0;
rc->wy=0.0;
rc->wz=0.0;
rc->ex=1.0;
rc->ey=0.0;
rc->ez=0.0;
rc->Momx=0.0;
rc->Momy=0.0;
rc->Momz=0.0;
rc->Amomx=0.0;
rc->Amomy=0.0;
rc->Amomz=0.0;
printf(" %i\t%i\t%i\t%i\t%i\t%le\t%le\t%le\n",rank,Nrbcp,ic,rc->id,rc->ip,rc->xcm,rc->ycm,rc->zcm);
}
}
void restart()
{
unsigned long int i,j,ic,kj,typstart,ip,id;
double xstart,ystart,zstart,vxstart,vystart,vzstart,axstart,aystart,azstart,xcmstart,ycmstart,zcmstart,Vxcmstart,Vycmstart,Vzcmstart,wxstart,wystart,wzstart,exstart,eystart,ezstart;
struct aftr *a,*a1;
struct sol *srd;
struct redcell *rc;
FILE *fp;
char readfile[256];
sprintf(readfile,"%s/sol_atp%ld-%09ld.dat",fname,rank,tsim);
printf("rank=%d readfile is=%s\n",rank,readfile);
fp = fopen(readfile,"r");
if(fp == NULL){
printf("Read file does not exist.");
exit(1);
}
fscanf(fp,"%le",&(totdt));
for(i=0;i<Naf;i++)
{
fscanf(fp,"%ld\t%ld\t%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le",&(j),&(typstart),&(xstart),&(ystart),&(zstart),&(vxstart),&(vystart),&(vzstart),&(axstart),&(aystart),&(azstart));
if(i != j) printf("RestartERRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRR");
a=at+i;
a->typ=typstart;
a->xreal=xstart;
a->yreal=ystart;
a->zreal=zstart;
a->vx=vxstart;
a->vy=vystart;
a->vz=vzstart;
a->ax=axstart;
a->ay=aystart;
a->az=azstart;
}
fscanf(fp,"%ld",&(Nrbcp));
for(ic=0;ic<Nrbcp;ic++)
{
// fscanf(fp,"%ld\t%le\t%le\t%le",&(j),&(xcmstart),&(ycmstart),&(zcmstart));
fscanf(fp,"%ld\t%ld\t%ld\t%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le",&(j),&(ip),&(id),&(xcmstart),&(ycmstart),&(zcmstart),&(Vxcmstart),&(Vycmstart),&(Vzcmstart),&(wxstart),&(wystart),&(wzstart),&(exstart),&(eystart),&(ezstart));
if(ic != j) printf("RestartERRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRR1");
rc=rbc+ic;
rc->xcm=xcmstart;
rc->ycm=ycmstart;
rc->zcm=zcmstart;
rc->id=id;
rc->ip=ip;
rc->Vxcm=Vxcmstart;
rc->Vycm=Vycmstart;
rc->Vzcm=Vzcmstart;
rc->wx=wxstart;
rc->wy=wystart;
rc->wz=wzstart;
rc->ex=exstart;
rc->ey=eystart;
rc->ez=ezstart;
rc->Momx=0.0;
rc->Momy=0.0;
rc->Momz=0.0;
rc->Amomx=0.0;
rc->Amomy=0.0;
rc->Amomz=0.0;
}
fscanf(fp,"%ld",&(Nsolp));
for(i=0;i<Nsolp;i++)
{
fscanf(fp,"%ld\t%ld\t%le\t%le\t%le\t%le\t%le\t%le",&(j),&(kj),&(xstart),&(ystart),&(zstart),&(vxstart),&(vystart),&(vzstart));
if(i != j || i != kj) printf("RestartERRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRR2");
srd=ss+i;
srd->n=kj;
srd->x=xstart;
srd->y=ystart;
srd->z=zstart;
srd->vx=vxstart;
srd->vy=vystart;
srd->vz=vzstart;
}
fclose(fp);
}
void snapshot1()
{
unsigned long int i,ic,j,k,j1,j2,m,out,nafp=0;
double xl,yl,zl,norm,x1,y1,z1,x2,y2,z2,x3,y3,z3,inv_d,d,norm1,d2;
double tx,ty,tz;
struct aftr *a,*a1;
struct cnline *c;
struct sol *srd;
struct redcell *rc;
FILE *fp;
char outfile[256];
j=length-1;
sprintf(outfile,"%s/sol_atp%ld-%09ld.dat",foutpoint1,rank,tsim);
fp = fopen(outfile,"w");
if(fp == NULL)
{
printf("EEEEEEEERRRRRRRRRRRRROOOOOOOOORRRRRRRR");
exit(1);
}
fprintf(fp,"%le\n",totdt);
for(i=0;i<Naf;i++)
{
a=at+i;
fprintf(fp,"%ld\t%ld\t%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le\n",i,a->typ,a->xreal,a->yreal,a->zreal,a->vx,a->vy,a->vz,a->ax,a->ay,a->az);
}
fprintf(fp,"%ld\n",Nrbcp);
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
fprintf(fp,"%ld\t%ld\t%ld\t%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le\n",ic,rc->ip,rc->id,rc->xcm,rc->ycm,rc->zcm,rc->Vxcm,rc->Vycm,rc->Vzcm,rc->wx,rc->wy,rc->wz,rc->ex,rc->ey,rc->ez);
}
fprintf(fp,"%ld\n",Nsolp);
for(i=0;i<Nsolp;i++)
{
srd=ss+i;
fprintf(fp,"%ld\t%ld\t%le\t%le\t%le\t%le\t%le\t%le\n",i,srd->n,srd->x,srd->y,srd->z,srd->vx,srd->vy,srd->vz);
}
fclose(fp);
}
void snapshot()
{
unsigned long int i,ic,j,k,j1,j2,m,out,nafp=0;
double xl,yl,zl,norm,x1,y1,z1,x2,y2,z2,x3,y3,z3,inv_d,d,norm1,d2;
double tx,ty,tz;
struct aftr *a,*a1;
struct cnline *c;
struct sol *srd;
struct redcell *rc;
FILE *fp;
char outfile[256];
j=length-1;
sprintf(outfile,"%s/atpic%ld-%09ld.dat",foutpoint,rank,tsim);
fp = fopen(outfile,"w");
if(fp == NULL)
{
printf("EEEEEEEERRRRRRRRRRRRROOOOOOOOORRRRRRRR");
exit(1);
}
for(i=0;i<Naf;i++)
{
a=at+i;
if(a->typ == 0) nafp++;
}
fprintf(fp,"%ld\n",nafp);
for(i=0;i<Naf-nflagella;i++)
{
a=at+i;
if(a->typ != 0) continue;
fprintf(fp,"%ld\t%le\t%le\t%le\n",i,a->xreal,a->yreal,a->zreal);
/* if(i==j)
{
fprintf(fp,"\n");
j+=length;
}
*/
}
m=0;
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
if((rc->xcm <= xer) && (rc->xcm > xsl))
{
m++;
}
}
fprintf(fp,"%ld\n",m);
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
if((rc->xcm <= xer) && (rc->xcm > xsl))
{
fprintf(fp,"%le\t%le\t%le\n",rc->xcm,rc->ycm,rc->zcm);
}
}
fclose(fp);
/*
for(i=0;i<length;i++)
{
fprintf(fp,"%le\t%le\t%le\n",(at+i)->xreal,(at+i)->yreal,(at+i)->zreal);
}
fprintf(fp,"\n\n");
a=(at+1);
i=1;
do
{
if(i==1)
a1=a;
if(i==2)
a1=a->helix[0];
if(i>2)
a1=a->helix[1];
fprintf(fp,"%le\t%le\t%le\n",a1->xreal,a1->yreal,a1->zreal);
//printf("%ld\t%ld\n",a->n,a1->n);
a=a1;
i++;
}
while(i<length+nflagella-5);
fprintf(fp,"\n\n");
for(i=0;i<flalen;i++)
{
c=cnt+i;
fprintf(fp,"%le\t%le\t%le\n",c->xreal,c->yreal,c->zreal);
} */
/*
j=length-1;
sprintf(name,"c-%09ld.dat",tsim);
fp=fopen(name,"w");
for(i=0;i<Naf-nflagella;i++)
{
a=at+i;
fprintf(fp,"%le\t%le\t%le\n",a->cx,a->cy,a->cz);
if(i==j)
{
fprintf(fp,"\n");
j+=length;
}
}
for(i=0;i<length;i++)
{
fprintf(fp,"%le\t%le\t%le\n",(at+i)->cx,(at+i)->cy,(at+i)->cz);
}
fprintf(fp,"\n\n");
a=(at+1);
i=1;
do
{
if(i==1)
a1=a;
if(i==2)
a1=a->helix[0];
if(i>2)
a1=a->helix[1];
fprintf(fp,"%le\t%le\t%le\n",a1->cx,a1->cy,a1->cz);
//printf("%ld\t%ld\n",a->n,a1->n);
a=a1;
i++;
}
while(i<length+nflagella-5);
fclose(fp);
*/
/*j=length-1;
sprintf(name,"c-%09ld.dat",tsim);
fp=fopen(name,"w");
for(i=0;i<Naf;i++)
{
a=at+i;
fprintf(fp,"%le\t%le\t%le\n",a->cx,a->cy,a->cz);
if(i==j)
{
fprintf(fp,"\n");
j+=length;
}
}
for(i=0;i<length;i++)
{
fprintf(fp,"%le\t%le\t%le\n",(at+i)->cx,(at+i)->cy,(at+i)->cz);
}
fprintf(fp,"\n\n");
for(i=0;i<flalen;i++)
{
c=cnt+i;
fprintf(fp,"%le\t%le\t%le\n",c->xreal,c->yreal,c->zreal);
}
fclose(fp);
*/
/* sprintf(name,"velacc-%09ld.dat",tsim);
fp=fopen(name,"w");
a=(at+1);
i=1;
do
{
if(i==1)
a1=a;
if(i==2)
a1=a->helix[0];
if(i>2)
a1=a->helix[1];
fprintf(fp,"%ld\t%le\t%le\t%le\t%le\t%le\t%le\n",i,a1->vx,a1->vy,a1->vz,a1->ax,a1->ay,a1->az);
//printf("%ld\t%ld\n",a->n,a1->n);
a=a1;
i++;
}
while(i<length+nflagella-5);
fprintf(fp,"\n\n");
tx=ty=tz=0;
for(i=0;i<Naf;i++)
{
a=at+i;
fprintf(fp,"%ld\t%le\t%le\t%le\n",i,a->vx,a->vy,a->vz);
}
fprintf(fp,"\n\n");
for(i=0;i<Naf;i++)
{
a=at+i;
fprintf(fp,"%ld\t%le\t%le\t%le\n",i,a->ax,a->ay,a->az);
}
fprintf(fp,"\n\n");
for(i=0;i<Naf;i++)
{
a=at+i;
fprintf(fp,"%ld\t%le\t%le\t%le\n",i,crossx(a->xreal,a->yreal,a->zreal,a->ax,a->ay,a->az),crossy(a->xreal,a->yreal,a->zreal,a->ax,a->ay,a->az),crossz(a->xreal,a->yreal,a->zreal,a->ax,a->ay,a->az));
}
fprintf(fp,"\n\n");
for(i=0;i<Naf;i++)
{
a=at+i;
inv_d=1./(a->xreal*a->xreal+a->yreal*a->yreal+a->zreal*a->zreal);
fprintf(fp,"%ld\t%le\t%le\t%le\n",i,crossx(a->xreal,a->yreal,a->zreal,a->vx,a->vy,a->vz)*inv_d,crossy(a->xreal,a->yreal,a->zreal,a->vx,a->vy,a->vz)*inv_d,crossz(a->xreal,a->yreal,a->zreal,a->vx,a->vy,a->vz)*inv_d);
}
fclose(fp);
*/
/*
sprintf(name,"sol-%09ld.dat",tsim);
fp=fopen(name,"w");
for(k=0;k<Nsol;k++)
{
srd=ss+k;
//srd->sp=0;
for(i=0;i<length;i++)
{
c=cnt+i;
//for(j=0;j<8;j++)
//{
//d2=dist2(c->cx,srd->pbcx[j],c->cy,srd->pbcy[j],c->cz,srd->pbcz[j]);
d2=dist2(c->cx,srd->x,c->cy,srd->y,c->cz,srd->z);
if(d2<5.)
{
x1=srd->x;
y1=srd->y;
z1=srd->z;
fprintf(fp,"%le\t%le\t%le\n",x1,y1,z1);
//srd->sp=1;
//}
}
}
}
fclose(fp);
*/
/*
if(tsim%20000==0 && tsim>0)
{
sprintf(name,"flow-%09ld.dat",tsim);
fp=fopen(name,"w");
for(i=0;i<L;i++)
for(j=0;j<L;j++)
for(k=0;k<L;k++)
{
tx=N_VCM[i+L*(j+L*k)].Vx;
ty=N_VCM[i+L*(j+L*k)].Vy;
tz=N_VCM[i+L*(j+L*k)].Vz;
d=sqrt(tx*tx+ty*ty+tz*tz);
if(d>0)
{
inv_d=1./d;
tx*=inv_d;
ty*=inv_d;
tz*=inv_d;
fprintf(fp,"%le\t%le\t%le\t%le\t%le\t%le\n",(double)i+0.5,(double)j+0.5,(double)k+0.5,tx,ty,tz);
//printf("%le\t%le\t%le\t%le\t%le\t%le\n",(double)i,(double)L*(double)i,(double)L*(double)L*(double)i,tx,ty,tz);
}
}
fclose(fp);
//exit(1);
}*/
}
void radiuscal()
{
unsigned long int i,j,k;
double dam1x,dam1y,dam1z,fx,fy,fz,l0,d2,d,inv_d,dax,day,daz,df,ds;
struct aftr *a1,*a2,*a3,*a4;
for(i=0;i<length-1;i++)
{
k=i;
j=0;
do
{
a1=(at+(k+j*length));
a2=(at+k+length*(j+1)+1);
a3=(at+(k+j*length+length));
a4=(at+(k+length*(j+1)+1)-length);
l0=a1->bn;
dam1x=(a1->xreal-a2->xreal);
dam1y=(a1->yreal-a2->yreal);
dam1z=(a1->zreal-a2->zreal);
d2=dist2(a1->xreal,a2->xreal,a1->yreal,a2->yreal,a1->zreal,a2->zreal);
df=sqrt(d2);
a1->rad2=d2*0.25;
a1->rad=df*0.5;
a2->rad2=d2*0.25;
a2->rad=df*0.5;
dax=(a3->xreal-a4->xreal);
day=(a3->yreal-a4->yreal);
daz=(a3->zreal-a4->zreal);
d2=dist2(a3->xreal,a4->xreal,a3->yreal,a4->yreal,a3->zreal,a4->zreal);
ds=sqrt(d2);
a3->rad2=d2*0.25;
a3->rad=ds*0.5;
a4->rad2=d2*0.25;
a4->rad=ds*0.5;
j++;
//printf("%ld\t%ld\t%ld\t%ld\n",a1->n,a2->n,a3->n,a4->n);
}
while(j<npoints-1);
}
//exit(1);
}
void bendbodyforcet0()
{
unsigned long int i,j,k;
double mrix,mriy,mriz,mrip1x,mrip1y,mrip1z;
double rix,riy,riz,rip1x,rip1y,rip1z,inv_ri,inv_rip1,inv_mri,inv_mrip1;
double inv_delta,cp,cm,delta;
double fx,fy,fz,tfx,tfy,tfz,ttx,tty,ttz,Tx,Ty,Tz;
struct aftr *a1,*a2,*a3;
j=0;
do
{
for(i=0;i<length-2;i++)
{
a1=at+j*length+i;
a2=at+j*length+i+1;
a3=at+j*length+i+2;
rix=a2->xreal-a1->xreal;
riy=a2->yreal-a1->yreal;
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal-a2->zreal;
/*
rix=a2->x0-a1->x0;
riy=a2->y0-a1->y0;
riz=a2->z0-a1->z0;
rip1x=a3->x0-a2->x0;
rip1y=a3->y0-a2->y0;
rip1z=a3->z0-a2->z0;
*/
inv_ri=1./sqrt(rix*rix+riy*riy+riz*riz);
inv_rip1=1./sqrt(rip1x*rip1x+rip1y*rip1y+rip1z*rip1z);
rix*=inv_ri;
riy*=inv_ri;
riz*=inv_ri;
rip1x*=inv_rip1;
rip1y*=inv_rip1;
rip1z*=inv_rip1;
cp=rix*rip1x+riy*rip1y+riz*rip1z;
a2->cangle1=cp;
// if(rank==1) printf("%ld\t%le\n",a2->n,acos(cp)*180./PI);
}
//printf("\n\n");
j++;
}
while(j<npoints);
//exit(1);
}
void ND()
{
unsigned long int i,ic,j,ki=0,kj=0,pi=0,pj=0,tsi=0,tsj=0,icol,jcol,iout;
double xl,yl,zl,sx,sy,sz,nfx,nfy,nfz,rbp;
double xcm,ycm,zcm,vxcm,vycm,vzcm,fx,fy,fz;
double xncm,yncm,zncm,rpc;
double xxcm,yycm,zzcm,vrx,vry,vrz,bici,deltaa,dtnew,rsq,vsq,tcol,tcol2,tcolmin,vradi,vdir,dryp,dic,dtnu;
struct aftr *a;
struct redcell *rc;
struct redcell *rc2;
nfx=nfy=nfz=1./(double)tsim;
xcm=ycm=zcm=vxcm=vycm=vzcm=xncm=yncm=zncm=0;
fx=fy=fz=j=0;
//////////////////////////
static double *hu;
static double *hv;
static double *ha;
static double *hb;
static double *pshu;
static double *pshv;
static double *psha;
static double *pshb;
static double *tshu;
static double *tshv;
static double *tsha;
static double *tshb;
static int n1st = 0;
if(n1st == 0){
hu = (double *) malloc(sizeof(double)*(5000));
if(hu == NULL){
printf("\n err_message(1)");
exit(1);
}
hv = (double *) malloc(sizeof(double)*(5000));
if(hv == NULL) exit(1);
ha = (double *) malloc(sizeof(double)*(5000));
if(ha == NULL) exit(1);
hb = (double *) malloc(sizeof(double)*(5000));
if(hb == NULL) exit(1);
pshu = (double *) malloc(sizeof(double)*(5000));
if(pshu == NULL){
printf("\n err_message(1)");
exit(1);
}
pshv = (double *) malloc(sizeof(double)*(5000));
if(pshv == NULL) exit(1);
psha = (double *) malloc(sizeof(double)*(5000));
if(psha == NULL) exit(1);
pshb = (double *) malloc(sizeof(double)*(5000));
if(pshb == NULL) exit(1);
tshu = (double *) malloc(sizeof(double)*(5000));
if(tshu == NULL){
printf("\n err_message(1)");
exit(1);
}
tshv = (double *) malloc(sizeof(double)*(5000));
if(tshv == NULL) exit(1);
tsha = (double *) malloc(sizeof(double)*(5000));
if(tsha == NULL) exit(1);
tshb = (double *) malloc(sizeof(double)*(5000));
if(tshb == NULL) exit(1);
n1st++;
}
// MPI_Status status;
pshu[pi++] = 0.0;
pshv[pj++] = 0.0;
psha[0] = 0.0;
pshb[0] = 0.0;
tshu[tsi++] = 0.0;
tshv[tsj++] = 0.0;
tsha[0] = 0.0;
tshb[0] = 0.0;
hu[ki++] = 0.0;
hv[kj++] = 0.0;
ha[0] = 0.0;
hb[0] = 0.0;
/////////////////////////////////////////
for(i=0;i<Naf;i++)
{
a=at+i;
///////////////////////////////////
if(a->typ != 0)continue;
a->vx+=(0.5*dtaf*a->ax);
a->vy+=(0.5*dtaf*a->ay);
a->vz+=(0.5*dtaf*a->az);
sx=dtaf*a->vx;
sy=dtaf*a->vy;
sz=dtaf*a->vz;
a->xreal+=sx;
a->yreal+=sy;
a->zreal+=sz;
xl=a->xreal;
yl=a->yreal;
zl=a->zreal;
rbp=sqrt((yl-ylc)*(yl-ylc)+(zl-zlc)*(zl-zlc));
if(rbp > Lr0)
{
bounceback(1,i,dtaf);
}
xl=a->xreal;
yl=a->yreal;
zl=a->zreal;
if(xl>(double)L || xl<0 || yl>(double)Lr1 || yl<0 || zl>(double)Lr1 || zl<0)
{
fprintf(fp,"cellbody out of the box\t%le\t%le\t%le\n",xl,yl,zl);
fp=fopen("info.txt","a");
fprintf(fp,"cellbody out of the box\t%le\t%le\t%le\n",xl,yl,zl);
fclose(fp);
exit(1);
}
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
rpc=sqrt((xl-rc->xcm)*(xl-rc->xcm)+(yl-rc->ycm)*(yl-rc->ycm)+(zl-rc->zcm)*(zl-rc->zcm));
if(rpc<Rrbc)
{
// printf(" rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaannnnnnnnnnnnnnnnnnnnnnnkkkkkkkkkkkkkkkkkkkk=%i\n",rank);
bouncebackrbc(1,i,ic,dtaf);
ic=50000;
}
}
////////////////////
xl=a->xreal;
yl=a->yreal;
zl=a->zreal;
///////////////////////////////
tshv[tsj++]=(double)i;
tshv[tsj++]=a->xreal;
tshv[tsj++]=a->yreal;
tshv[tsj++]=a->zreal;
tshu[tsi++]=(double)i;
tshu[tsi++]=a->xreal;
tshu[tsi++]=a->yreal;
tshu[tsi++]=a->zreal;
if(xl >= xer)
{
a->typ=1;
pshv[pj++]=(double)i;
pshv[pj++]=a->xreal;
pshv[pj++]=a->yreal;
pshv[pj++]=a->zreal;
pshv[pj++]=a->vx;
pshv[pj++]=a->vy;
pshv[pj++]=a->vz;
}
else
{
hv[kj++]=(double)i;
hv[kj++]=a->xreal;
hv[kj++]=a->yreal;
hv[kj++]=a->zreal;
}
if(xl < xsl)
{
a->typ=1;
pshu[pi++]=(double)i;
pshu[pi++]=a->xreal;
pshu[pi++]=a->yreal;
pshu[pi++]=a->zreal;
pshu[pi++]=a->vx;
pshu[pi++]=a->vy;
pshu[pi++]=a->vz;
}
else
{
hu[ki++]=(double)i;
hu[ki++]=a->xreal;
hu[ki++]=a->yreal;
hu[ki++]=a->zreal;
}
}
if(ki == 1) ki=0;
if(kj == 1) kj=0;
hu[0]=(double)ki;
hv[0]=(double)kj;
if(pi == 1) pi=0;
if(pj == 1) pj=0;
pshu[0]=(double)pi;
pshv[0]=(double)pj;
if(numprocs > 1){
MPI_Sendrecv(&hu[0],ki,MPI_DOUBLE,left,1,&ha[0],5000,MPI_DOUBLE,right,1,comm1d,&status);
MPI_Sendrecv(&hv[0],kj,MPI_DOUBLE,right,2,&hb[0],5000,MPI_DOUBLE,left,2,comm1d,&status);
MPI_Sendrecv(&pshu[0],pi,MPI_DOUBLE,left,100,&psha[0],5000,MPI_DOUBLE,right,100,comm1d,&status);
MPI_Sendrecv(&pshv[0],pj,MPI_DOUBLE,right,101,&pshb[0],5000,MPI_DOUBLE,left,101,comm1d,&status);
}
///*****************************************//
ki = (int)ha[0];
kj = 1;
while( kj < ki){
i=(int)ha[kj++];
a=at+i;
a->typ=1;
a->xreal=ha[kj++];
a->yreal=ha[kj++];
a->zreal=ha[kj++];
// printf(" %i\t%i\t%i\t%le\t%i\t%i\n",ki,rank,a->typ,a->xreal,xsl,xer);
}
ki = (int)hb[0];
kj = 1;
while( kj < ki){
i=(int)hb[kj++];
a=at+i;
a->typ=1;
a->xreal=hb[kj++];
a->yreal=hb[kj++];
a->zreal=hb[kj++];
}
///***************************************//
ki = (int)psha[0];
kj = 1;
while( kj < ki){
i=(int)psha[kj++];
a=at+i;
a->typ=0;
a->xreal=psha[kj++];
a->yreal=psha[kj++];
a->zreal=psha[kj++];
a->vx=psha[kj++];
a->vy=psha[kj++];
a->vz=psha[kj++];
// printf(" %i\t%i\t%i\t%le\t%i\t%i\n",ki,rank,a->typ,a->xreal,xsl,xer);
}
ki = (int)pshb[0];
kj = 1;
while( kj < ki){
i=(int)pshb[kj++];
a=at+i;
a->typ=0;
a->xreal=pshb[kj++];
a->yreal=pshb[kj++];
a->zreal=pshb[kj++];
a->vx=pshb[kj++];
a->vy=pshb[kj++];
a->vz=pshb[kj++];
// printf(" %i\t%i\t%i\t%le\t%i\t%i\n",ki,rank,a->typ,a->xreal,xsl,xer);
}
///*****************************************///
if(tsi == 1) tsi=0;
if(tsj == 1) tsj=0;
tshu[0]=(double)tsi;
tshv[0]=(double)tsj;
if(rank > 1) MPI_Send(&tshu[0],tsi,MPI_DOUBLE,rank-2,102,MPI_COMM_WORLD);
if(rank < numprocs-2)
{
MPI_Recv(&tsha[0],5000,MPI_DOUBLE,rank+2,102,MPI_COMM_WORLD,&status);
ki = (int)tsha[0];
kj = 1;
while( kj < ki){
i=(int)tsha[kj++];
a=at+i;
a->typ=1;
a->xreal=tsha[kj++];
a->yreal=tsha[kj++];
a->zreal=tsha[kj++];
// printf(" %i\t%i\t%i\t%le\t%i\t%i\n",ki,rank,a->typ,a->xreal,xsl,xer);
}
}
if(rank < numprocs-2) MPI_Send(&tshv[0],tsj,MPI_DOUBLE,rank+2,103,MPI_COMM_WORLD);
if(rank > 1)
{
MPI_Recv(&tshb[0],5000,MPI_DOUBLE,rank-2,103,MPI_COMM_WORLD,&status);
ki = (int)tshb[0];
kj = 1;
while( kj < ki){
i=(int)tshb[kj++];
a=at+i;
a->typ=1;
a->xreal=tshb[kj++];
a->yreal=tshb[kj++];
a->zreal=tshb[kj++];
// printf(" %i\t%i\t%i\t%le\t%i\t%i\n",ki,rank,a->typ,a->xreal,xsl,xer);
}
}
//***********************************************//
calculateforces();
}
void MDRBC()
{
unsigned long int i,ic,j,ki=0,kj=0,pi=0,pj=0,tsi=0,tsj=0,icol,jcol,iout,out;
double xl,yl,zl,sx,sy,sz,nfx,nfy,nfz,rbp,rbpo,xlo,ylo,zlo,dtp;
double xcm,ycm,zcm,vxcm,vycm,vzcm,fx,fy,fz;
double xncm,yncm,zncm,rpc,rctoc;
double xxcm,yycm,zzcm,vrx,vry,vrz,bici,deltaa,dtnew,rsq,vsq,tcol,tcol2,tcolmin,vradi,vdir,dryp,dic,dtnu;
struct aftr *a;
struct redcell *rc;
struct redcell *rc2;
nfx=nfy=nfz=1./(double)tsim;
xcm=ycm=zcm=vxcm=vycm=vzcm=xncm=yncm=zncm=0;
fx=fy=fz=j=0;
/////////////////////////////
static double *rhu;
static double *rhv;
static double *rha;
static double *rhb;
static double *rpshu;
static double *rpshv;
static double *rpsha;
static double *rpshb;
static int n310st = 0;
if(n310st == 0){
rhu = (double *) malloc(sizeof(double)*(5000));
if(rhu == NULL){
printf("\n err_message(1)");
exit(1);
}
rhv = (double *) malloc(sizeof(double)*(5000));
if(rhv == NULL) exit(1);
rha = (double *) malloc(sizeof(double)*(5000));
if(rha == NULL) exit(1);
rhb = (double *) malloc(sizeof(double)*(5000));
if(rhb == NULL) exit(1);
rpshu = (double *) malloc(sizeof(double)*(5000));
if(rpshu == NULL){
printf("\n err_message(1)");
exit(1);
}
rpshv = (double *) malloc(sizeof(double)*(5000));
if(rpshv == NULL) exit(1);
rpsha = (double *) malloc(sizeof(double)*(5000));
if(rpsha == NULL) exit(1);
rpshb = (double *) malloc(sizeof(double)*(5000));
if(rpshb == NULL) exit(1);
n310st++;
}
//**********************************************//
//////////////////////////////
if(OBSM==1)
{
ki=0;
kj=0;
rhu[ki++] = 0.0;
rhv[kj++] = 0.0;
rha[0] = 0.0;
rhb[0] = 0.0;
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip != 1)continue;
if(rc->xcm <= xsl+Rrbc+0.55)
{
rhu[ki++]=(double)rc->id;
rhu[ki++]=rc->Momx;
rhu[ki++]=rc->Momy;
rhu[ki++]=rc->Momz;
rhu[ki++]=rc->Amomx;
rhu[ki++]=rc->Amomy;
rhu[ki++]=rc->Amomz;
rhu[ki++]=rc->Vxcm;
rhu[ki++]=rc->Vycm;
rhu[ki++]=rc->Vzcm;
rhu[ki++]=rc->wx;
rhu[ki++]=rc->wy;
rhu[ki++]=rc->wz;
}
else if(rc->xcm >= xer-Rrbc-0.55)
{
rhv[kj++]=(double)rc->id;
rhv[kj++]=rc->Momx;
rhv[kj++]=rc->Momy;
rhv[kj++]=rc->Momz;
rhv[kj++]=rc->Amomx;
rhv[kj++]=rc->Amomy;
rhv[kj++]=rc->Amomz;
}
}
if(ki == 1) ki=0;
if(kj == 1) kj=0;
rhu[0]=(double)ki;
rhv[0]=(double)kj;
if(numprocs > 1){
MPI_Sendrecv(&rhu[0],ki,MPI_DOUBLE,left,185,&rha[0],5000,MPI_DOUBLE,right,185,comm1d,&status);
MPI_Sendrecv(&rhv[0],kj,MPI_DOUBLE,right,186,&rhb[0],5000,MPI_DOUBLE,left,186,comm1d,&status);
}
///*****************************************//
ki = (int)rha[0];
kj = 1;
while( kj < ki){
i=(int)rha[kj++];
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip != 1)continue;
if(rc->id == i)
{
rc->Momx+=rha[kj++];
rc->Momy+=rha[kj++];
rc->Momz+=rha[kj++];
rc->Amomx+=rha[kj++];
rc->Amomy+=rha[kj++];
rc->Amomz+=rha[kj++];
rc->Vxcm=rha[kj++];
rc->Vycm=rha[kj++];
rc->Vzcm=rha[kj++];
rc->wx=rha[kj++];
rc->wy=rha[kj++];
rc->wz=rha[kj++];
ic=Nrbcp+10;
}
}
if(ic < Nrbcp+3)
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_ip");
printf(" rank=%i id=%i xsl=%i xer=%i \n",rank,i,xsl,xer);
exit(1);
}
}
ki = (int)rhb[0];
kj = 1;
while( kj < ki){
i=(int)rhb[kj++];
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip != 1)continue;
if(rc->id == i)
{
rc->Momx+=rhb[kj++];
rc->Momy+=rhb[kj++];
rc->Momz+=rhb[kj++];
rc->Amomx+=rhb[kj++];
rc->Amomy+=rhb[kj++];
rc->Amomz+=rhb[kj++];
ic=Nrbcp+10;
}
}
if(ic < Nrbcp+3)
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_ipbb");
printf(" rank=%i id=%i xsl=%i xer=%i \n",rank,i,xsl,xer);
exit(1);
}
}
///***************************************//
/////////////////////
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
rc->Vxcm+=-(rc->Momx/Mrbc);
rc->Vycm+=-(rc->Momy/Mrbc);
rc->Vzcm+=-(rc->Momz/Mrbc);
rc->wx+=-(rc->Amomx/Irbc);
rc->wy+=-(rc->Amomy/Irbc);
rc->wz+=-(rc->Amomz/Irbc);
if(rc->Vxcm >1.0)rc->Vxcm=1.0;
if(rc->Vycm >1.0)rc->Vycm=1.0;
if(rc->Vzcm >1.0)rc->Vzcm=1.0;
if(rc->wx >1.0)rc->wx=1.0;
if(rc->wy >1.0)rc->wy=1.0;
if(rc->wz >1.0)rc->wz=1.0;
// rc->xcm+=rc->Vxcm*dt;
// rc->ycm+=rc->Vycm*dt;
// rc->zcm+=rc->Vzcm*dt;
rc->ex+=(crossx(rc->wx,rc->wy,rc->wz,rc->ex,rc->ey,rc->ez))*dt;
rc->ey+=(crossy(rc->wx,rc->wy,rc->wz,rc->ex,rc->ey,rc->ez))*dt;
rc->ez+=(crossz(rc->wx,rc->wy,rc->wz,rc->ex,rc->ey,rc->ez))*dt;
rc->ex=rc->ex/sqrt(rc->ex*rc->ex+rc->ey*rc->ey+rc->ez*rc->ez);
rc->ey=rc->ey/sqrt(rc->ex*rc->ex+rc->ey*rc->ey+rc->ez*rc->ez);
rc->ez=rc->ez/sqrt(rc->ex*rc->ex+rc->ey*rc->ey+rc->ez*rc->ez);
rc->Momx=0.0;
rc->Momy=0.0;
rc->Momz=0.0;
rc->Amomx=0.0;
rc->Amomy=0.0;
rc->Amomz=0.0;
}
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
rc->coltim=100.0;
}
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
rbp=sqrt((ylc-rc->ycm)*(ylc-rc->ycm)+(zlc-rc->zcm)*(zlc-rc->zcm));
if(rbp+Rrbc >= Lr0)
{
printf("aEsRRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_rbp");
printf(" rank=%i ic=%i ip=%i rbp=%e \n",rank,ic,rc->ip,rbp);
exit(1);
}
rbp=sqrt((ylc-(rc->ycm+rc->Vycm*dt))*(ylc-(rc->ycm+rc->Vycm*dt))+(zlc-(rc->zcm+rc->Vzcm*dt))*(zlc-(rc->zcm+rc->Vzcm*dt)));
if(rbp+Rrbc >= Lr0)
{
yycm=rc->ycm-ylc;
zzcm=rc->zcm-zlc;
vry=rc->Vycm;
vrz=rc->Vzcm;
bici=yycm*vry+zzcm*vrz;
if(bici >= 0.0)
{
rsq=yycm*yycm+zzcm*zzcm;
vsq=vry*vry+vrz*vrz;
dic=Lr0-Rrbc;
deltaa=bici*bici-vsq*(rsq-dic*dic);
if(deltaa>0)
{
tcol=(-bici+sqrt(deltaa))/vsq;
if(tcol < rc->coltim && tcol>0)
{
rc->coltim=tcol;
rc->partnr=5000000;
}
}
if(deltaa<=0.0 || tcol<=0.0)
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_deltat or tcol");
printf(" rank=%i ic=%i xsl=%i xer=%i deltaa=%e tcol=%e \n",rank,ic,xsl,xer,deltaa,tcol);
exit(1);
}
}
else
{
printf("ddddERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_deltat or tcol");
printf(" rank=%i ic=%i bici=%e tsim=%d \n",rank,ic,bici,tsim);
exit(1);
}
}
}
////////////////////////////////
for(ic=0;ic<Nrbcp-1;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
for(i=ic+1;i<Nrbcp;i++)
{
rc2=rbc+i;
if(rc2->ip == 2)continue;
xxcm=rc->xcm-rc2->xcm;
yycm=rc->ycm-rc2->ycm;
zzcm=rc->zcm-rc2->zcm;
vrx=rc->Vxcm-rc2->Vxcm;
vry=rc->Vycm-rc2->Vycm;
vrz=rc->Vzcm-rc2->Vzcm;
bici=xxcm*vrx+yycm*vry+zzcm*vrz;
if(bici < 0.0)
{
rsq=xxcm*xxcm+yycm*yycm+zzcm*zzcm;
vsq=vrx*vrx+vry*vry+vrz*vrz;
deltaa=bici*bici-vsq*(rsq-4*Rrbc*Rrbc);
if(deltaa>0)
{
tcol=(-bici-sqrt(deltaa))/vsq;
if(tcol < rc->coltim && tcol>0)
{
rc->coltim=tcol;
rc->partnr=i;
}
if(tcol < rc2->coltim && tcol>0)
{
rc2->coltim=tcol;
rc2->partnr=ic;
}
}
}
}
}
//////////////////////////
tcol=100.0;
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
if(rc->coltim < tcol)
{
tcol=rc->coltim;
icol=ic;
}
}
// rc=rbc+icol;
// jcol=rc->partnr;
// MPI_Allreduce(&a,&a,1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
MPI_Allreduce(&tcol,&tcolmin,1,MPI_DOUBLE,MPI_MIN,comm1d);
//////////////////////////////////////////////////////////////////////
dtnew=dt;
dtnu=dt;
iout=1;
if(tcolmin <dt)
{
dtnew=tcolmin;
iout=0;
}
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
rc->xcm+=rc->Vxcm*dtnew;
rc->ycm+=rc->Vycm*dtnew;
rc->zcm+=rc->Vzcm*dtnew;
rc->coltim-=dtnew;
}
// if(rc->id == 369 && tsim >459000)
//////////////////////////////////////////////////////////////////////////////////////////
while(iout==0){
dtnu-=tcolmin;
ki=0;
kj=0;
rhu[ki++] = 0.0;
rhv[kj++] = 0.0;
rha[0] = 0.0;
rhb[0] = 0.0;
//******************************//
if(tcol < tcolmin+0.000000001)
{
rc=rbc+icol;
jcol=rc->partnr;
if(jcol==5000000)
{
yycm=rc->ycm-ylc;
zzcm=rc->zcm-zlc;
if(rc->Vycm*yycm >0.0) rc->Vycm=-rc->Vycm;
if(rc->Vzcm*zzcm >0.0) rc->Vzcm=-rc->Vzcm;
}
else
{
if(jcol>70000)
{
printf("ppppppppERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_deltat or tcol");
printf(" rank=%i jcol=%i xsl=%i xer=%i deltaa=%e tcol=%e \n",rank,jcol,xsl,xer,deltaa,tcol);
exit(1);
}
rc2=rbc+jcol;
xxcm=rc->xcm-rc2->xcm;
yycm=rc->ycm-rc2->ycm;
zzcm=rc->zcm-rc2->zcm;
vrx=rc->Vxcm-rc2->Vxcm;
vry=rc->Vycm-rc2->Vycm;
vrz=rc->Vzcm-rc2->Vzcm;
bici=xxcm*vrx+yycm*vry+zzcm*vrz;
bici/=(-4*Rrbc*Rrbc);
rc->Vxcm+= bici*xxcm;
rc->Vycm+= bici*yycm;
rc->Vzcm+= bici*zzcm;
rc2->Vxcm-= bici*xxcm;
rc2->Vycm-= bici*yycm;
rc2->Vzcm-= bici*zzcm;
if(rc->ip == 1)
{
if(rc->xcm <= xsl+Rrbc+0.75)
{
if( (rc2->ip == 0) || ( (rc2->ip == 1) && (rc2->xcm > (xsl+Rrbc+1.0))) )
{
rhu[ki++]=(double)rc->id;
rhu[ki++]=rc->Vxcm;
rhu[ki++]=rc->Vycm;
rhu[ki++]=rc->Vzcm;
}
}
else if(rc->xcm >= xer-Rrbc-0.75)
{
if( (rc2->ip == 0) || ( (rc2->ip == 1) && (rc2->xcm < (xer-Rrbc-1.0))) )
{
rhv[kj++]=(double)rc->id;
rhv[kj++]=rc->Vxcm;
rhv[kj++]=rc->Vycm;
rhv[kj++]=rc->Vzcm;
}
}
}
if(rc2->ip == 1)
{
if(rc2->xcm <= xsl+Rrbc+0.75)
{
if( (rc->ip == 0) || ( (rc->ip == 1) && (rc->xcm > (xsl+Rrbc+1.0))) )
{
rhu[ki++]=(double)rc2->id;
rhu[ki++]=rc2->Vxcm;
rhu[ki++]=rc2->Vycm;
rhu[ki++]=rc2->Vzcm;
}
}
else if(rc2->xcm >= xer-Rrbc-0.75)
{
if( (rc->ip == 0) || ( (rc->ip == 1) && (rc->xcm < (xer-Rrbc-1.0))) )
{
rhv[kj++]=(double)rc2->id;
rhv[kj++]=rc2->Vxcm;
rhv[kj++]=rc2->Vycm;
rhv[kj++]=rc2->Vzcm;
}
}
}
/////////////////////
}
}
////////////////////////////////////////////////////////////////////////
if(ki == 1) ki=0;
if(kj == 1) kj=0;
rhu[0]=(double)ki;
rhv[0]=(double)kj;
rha[0] = 0.0;
rhb[0] = 0.0;
if(numprocs > 1){
MPI_Sendrecv(&rhu[0],ki,MPI_DOUBLE,left,187,&rha[0],5000,MPI_DOUBLE,right,187,comm1d,&status);
MPI_Sendrecv(&rhv[0],kj,MPI_DOUBLE,right,188,&rhb[0],5000,MPI_DOUBLE,left,188,comm1d,&status);
}
ki = (int)rha[0];
kj = 1;
while( kj < ki){
i=(int)rha[kj++];
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip != 1)continue;
if(rc->id == i)
{
rc->Vxcm=rha[kj++];
rc->Vycm=rha[kj++];
rc->Vzcm=rha[kj++];
tcol = tcolmin;
icol=ic;
jcol=6000000;
ic=Nrbcp+10;
}
}
if(ic < Nrbcp+3)
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_ip2");
printf(" rank=%i id=%i xsl=%i xer=%i \n",rank,i,xsl,xer);
exit(1);
}
}
ki = (int)rhb[0];
kj = 1;
while( kj < ki){
i=(int)rhb[kj++];
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip != 1)continue;
if(rc->id == i)
{
rc->Vxcm=rhb[kj++];
rc->Vycm=rhb[kj++];
rc->Vzcm=rhb[kj++];
icol=ic;
jcol=6000000;
tcol = tcolmin;
ic=Nrbcp+10;
}
}
if(ic < Nrbcp+3)
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_ip3");
printf(" rank=%i id=%i xsl=%i xer=%i \n",rank,i,xsl,xer);
exit(1);
}
}
if(tcol < tcolmin+0.000000001)
{
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
if(ic==icol || rc->partnr==icol || ic==jcol || rc->partnr==jcol)
{
rc->coltim=100.0;
rbp=sqrt((ylc-(rc->ycm+rc->Vycm*dtnu))*(ylc-(rc->ycm+rc->Vycm*dtnu))+(zlc-(rc->zcm+rc->Vzcm*dtnu))*(zlc-(rc->zcm+rc->Vzcm*dtnu)));
if(rbp+Rrbc >= Lr0)
{
yycm=rc->ycm-ylc;
zzcm=rc->zcm-zlc;
vry=rc->Vycm;
vrz=rc->Vzcm;
bici=yycm*vry+zzcm*vrz;
if(bici >= 0.0)
{
rsq=yycm*yycm+zzcm*zzcm;
vsq=vry*vry+vrz*vrz;
dic=Lr0-Rrbc;
deltaa=bici*bici-vsq*(rsq-dic*dic);
if(deltaa>0.0)
{
tcol2=(-bici+sqrt(deltaa))/vsq;
if(tcol2 < rc->coltim && tcol2>0.0)
{
rc->coltim=tcol2;
rc->partnr=5000000;
}
}
if(deltaa<0.0 || tcol2<0.0)
{
printf("ffffERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_deltat or tcol2");
printf(" rank=%i ic=%i xsl=%i xer=%i deltaa=%e tcol2=%e \n",rank,ic,xsl,xer,deltaa,tcol2);
exit(1);
}
}
else
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_bici2");
printf(" rank=%i ic=%i xsl=%i xer=%i bici=%e \n",rank,ic,xsl,xer,bici);
exit(1);
}
}
}
}
}
///////////////////////////////////////////////////////////////////
if(tcol < tcolmin+0.000000001)
{
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
if(ic==icol || rc->partnr==icol || ic==jcol || rc->partnr==jcol)
{
for(i=0;i<Nrbcp;i++)
{
rc2=rbc+i;
if(rc2->ip == 2)continue;
if(ic!=i)
{
xxcm=rc->xcm-rc2->xcm;
yycm=rc->ycm-rc2->ycm;
zzcm=rc->zcm-rc2->zcm;
vrx=rc->Vxcm-rc2->Vxcm;
vry=rc->Vycm-rc2->Vycm;
vrz=rc->Vzcm-rc2->Vzcm;
bici=xxcm*vrx+yycm*vry+zzcm*vrz;
if(bici < 0.0)
{
rsq=xxcm*xxcm+yycm*yycm+zzcm*zzcm;
vsq=vrx*vrx+vry*vry+vrz*vrz;
deltaa=bici*bici-vsq*(rsq-4*Rrbc*Rrbc);
if(deltaa>0.0)
{
tcol2=(-bici-sqrt(deltaa))/vsq;
if(tcol2 < rc->coltim && tcol2>0.0)
{
rc->coltim=tcol2;
rc->partnr=i;
}
if(tcol2 < rc2->coltim && tcol2>0.0)
{
rc2->coltim=tcol2;
rc2->partnr=ic;
}
}
}
}
}
}
}
}
/////////////////////////////////////////////////////////
tcol=100.0;
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
if(rc->coltim < tcol)
{
tcol=rc->coltim;
icol=ic;
}
}
MPI_Allreduce(&tcol,&tcolmin,1,MPI_DOUBLE,MPI_MIN,comm1d);
//printf("rankkkkkkkkkkkkkkkkkkkkkkkk22222222222222bbbbbbbbb8=%d tsim=%d tcol=%e dtnu=%e tcolmin=%e \n",rank, tsim, tcol, dtnu, tcolmin);
//////////////////////moving all obstacles with tcolmin ////////////////
if(tcolmin <dtnu)
{
dtnew=tcolmin;
iout=0;
}
else
{
dtnew=dtnu;
iout=1;
}
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
rc->xcm+=rc->Vxcm*dtnew;
rc->ycm+=rc->Vycm*dtnew;
rc->zcm+=rc->Vzcm*dtnew;
rc->coltim-=dtnew;
// if(tsim>495100 && rc->id == 369)
// printf(" rank=%i tsim=%d id=%i ip=%i vxcm=%e vycm=%e vzcm=%e xcm=%e ycm=%e zcm=%e wx=%e wy=%e wz=%e \n",rank,tsim,rc->id,rc->ip,rc->Vxcm,rc->Vycm,rc->Vzcm,rc->xcm,rc->ycm,rc->zcm,rc->wx,rc->wy,rc->wz);
}
///*************************************************************/////
}
//printf("rankkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk2222222222222233333333=%d tcol = %e dt=%e tcolmin=%e iout%d \n",rank, tcol, dt, tcolmin, iout);
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2) continue;
xlo=rc->xcm;
ylo=rc->ycm;
zlo=rc->zcm;
// dtp=dt*0.5;
for(i=0;i<Naf;i++)
{
a=at+i;
if(a->typ == 2)continue;
xl=a->xreal;
yl=a->yreal;
zl=a->zreal;
rbpo=sqrt((xl-xlo)*(xl-xlo)+(yl-ylo)*(yl-ylo)+(zl-zlo)*(zl-zlo));
dtp=dt*0.1;
if(rbpo < Rrbc)
{
rc->Vxcm=-rc->Vxcm;
rc->Vycm=-rc->Vycm;
rc->Vzcm=-rc->Vzcm;
out=0;
j=0;
do
{
rc->xcm+=rc->Vxcm*dtp;
rc->ycm+=rc->Vycm*dtp;
rc->zcm+=rc->Vzcm*dtp;
j++;
xlo=rc->xcm;
ylo=rc->ycm;
zlo=rc->zcm;
rbpo=sqrt((xl-xlo)*(xl-xlo)+(yl-ylo)*(yl-ylo)+(zl-zlo)*(zl-zlo));
rbp=sqrt((ylc-rc->ycm)*(ylc-rc->ycm)+(zlc-rc->zcm)*(zlc-rc->zcm));
if(rbpo >= Rrbc || j>10 || rbp+Rrbc >= Lr0)
{
out=1;
if(rbp+Rrbc >= Lr0)
{
rc->xcm-=rc->Vxcm*dtp;
rc->ycm-=rc->Vycm*dtp;
rc->zcm-=rc->Vzcm*dtp;
}
rc->Vxcm=0.0;
rc->Vycm=0.0;
rc->Vzcm=0.0;
}
}
while(out==0);
//printf("btttttttRRRRRRRRRRROOOOOhjkllgdfOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRa=%d tsim=%d xcm=%e Vxcm=%e wx=%e ip=%d ic=%d id=%d rbpo=%le xer=%d \n",rank,tsim, rc->xcm,rc->Vxcm,rc->wx,rc->ip, ic,rc->id, rbpo,xer);
rbp=sqrt((ylc-rc->ycm)*(ylc-rc->ycm)+(zlc-rc->zcm)*(zlc-rc->zcm));
if( (Rrbc-rbpo) > 0.004 )
{
rc->ip = 2;
// printf("ERRRRRRRRRRRRRRRRROOOOOhjkllgdfOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRa=%d tsim=%d xcm=%e Vxcm=%e wx=%e ip=%d ic=%d id=%d rbpo=%le xer=%d \n",rank,tsim, rc->xcm,rc->Vxcm,rc->wx,rc->ip, ic,rc->id, rbpo,xer);
}
}
}
}
ki=0;
kj=0;
rhu[ki++] = 0.0;
rhv[kj++] = 0.0;
rha[0] = 0.0;
rhb[0] = 0.0;
pi=0;
rpshu[pi++] = 0.0;
pj=0;
rpshv[pj++] = 0.0;
rpsha[0] = 0.0;
rpshb[0] = 0.0;
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2) continue;
if(rc->ip == 0)
{
if(rc->xcm <= xsl+Rrbc+0.5)
{
//printf("rankkkkkkkkkkkkkkkkkkkkkkkkdddddddddddddddddddu=%d tsim=%d xcm=%e dtnu=%e ic=%d id=%d xsl=%d xer=%d \n",rank,tsim, rc->xcm, dtnu, ic,rc->id, xsl,xer);
rc->ip = 1;
rhu[ki++]=(double)rc->id;
rhu[ki++]=rc->xcm;
rhu[ki++]=rc->ycm;
rhu[ki++]=rc->zcm;
rhu[ki++]=rc->Vxcm;
rhu[ki++]=rc->Vycm;
rhu[ki++]=rc->Vzcm;
rhu[ki++]=rc->wx;
rhu[ki++]=rc->wy;
rhu[ki++]=rc->wz;
rhu[ki++]=rc->ex;
rhu[ki++]=rc->ey;
rhu[ki++]=rc->ez;
}
else if(rc->xcm >= xer-Rrbc-0.5)
{
//printf("rankkkkkkkkkkkkkkkkkkkkkkkkdddddddddddddddddddv=%d tsim=%d xcm=%e dtnu=%e ic=%d id=%d xsl=%d xer=%d \n",rank,tsim, rc->xcm, dtnu, ic,rc->id, xsl,xer);
rc->ip = 1;
rhv[kj++]=(double)rc->id;
rhv[kj++]=rc->xcm;
rhv[kj++]=rc->ycm;
rhv[kj++]=rc->zcm;
rhv[kj++]=rc->Vxcm;
rhv[kj++]=rc->Vycm;
rhv[kj++]=rc->Vzcm;
rhv[kj++]=rc->wx;
rhv[kj++]=rc->wy;
rhv[kj++]=rc->wz;
rhv[kj++]=rc->ex;
rhv[kj++]=rc->ey;
rhv[kj++]=rc->ez;
}
}
else if(rc->ip == 1)
{
if((rc->xcm > xsl+Rrbc+0.5) && (rc->xcm < xer-Rrbc-0.5) && (rc->xcm < (xer+xsl)/2.0) )
{
rc->ip = 0;
rpshu[pi++]=(double)rc->id;
// printf("rankkkkkkkkkkkkkkkkkkkkk6666666666666666666666=%d tsim=%d xcm = %e xer=%d xsl=%d ic=%d ip=%d pi=%d id=%d \n",rank,tsim, rc->xcm,xer,xsl,ic,rc->ip,pi,rc->id);
}
if((rc->xcm > xsl+Rrbc+0.5) && (rc->xcm < xer-Rrbc-0.5) && (rc->xcm > (xer+xsl)/2.0))
{
rc->ip = 0;
rpshv[pj++]=(double)rc->id;
// printf("trankkkkkkkkkkkkkkkkkkkkk6666666666666666666666=%d tsim=%d xcm = %e xer=%d xsl=%d ic=%d ip=%d pj=%d id=%d \n",rank,tsim, rc->xcm,xer,xsl,ic,rc->ip,pj,rc->id);
}
}
}
if(ki == 1) ki=0;
if(kj == 1) kj=0;
rhu[0]=(double)ki;
rhv[0]=(double)kj;
rha[0] = 0.0;
rhb[0] = 0.0;
if(pi == 1) pi=0;
if(pj == 1) pj=0;
rpshu[0]=(double)pi;
rpshv[0]=(double)pj;
//printf("rankkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk6666666666666666666666cccccccccccc=%d xer=%d xsl=%d ki=%d kj=%d pi=%d \n",rank, xer,xsl,ki,kj,pi);
if(numprocs > 1){
MPI_Sendrecv(&rhu[0],ki,MPI_DOUBLE,left,189,&rha[0],5000,MPI_DOUBLE,right,189,comm1d,&status);
MPI_Sendrecv(&rhv[0],kj,MPI_DOUBLE,right,190,&rhb[0],5000,MPI_DOUBLE,left,190,comm1d,&status);
MPI_Sendrecv(&rpshu[0],pi,MPI_DOUBLE,left,191,&rpsha[0],5000,MPI_DOUBLE,right,191,comm1d,&status);
MPI_Sendrecv(&rpshv[0],pj,MPI_DOUBLE,right,192,&rpshb[0],5000,MPI_DOUBLE,left,192,comm1d,&status);
}
///*****************************************//
ki = (int)rha[0];
kj = 1;
while( kj < ki){
i=(int)rha[kj++];
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip != 2)continue;
rc->id = i;
rc->ip = 1;
rc->xcm=rha[kj++];
rc->ycm=rha[kj++];
rc->zcm=rha[kj++];
if(rank==numprocs-1) rc->xcm+=(double)L;
rc->Vxcm=rha[kj++];
rc->Vycm=rha[kj++];
rc->Vzcm=rha[kj++];
rc->wx=rha[kj++];
rc->wy=rha[kj++];
rc->wz=rha[kj++];
rc->ex=rha[kj++];
rc->ey=rha[kj++];
rc->ez=rha[kj++];
rc->Momx=0.0;
rc->Momy=0.0;
rc->Momz=0.0;
rc->Amomx=0.0;
rc->Amomy=0.0;
rc->Amomz=0.0;
ic = Nrbcp+10;
}
if(ic < Nrbcp+3)
{
ic = Nrbcp;
Nrbcp++;
rc=rbc+ic;
rc->id = i;
rc->ip = 1;
rc->xcm=rha[kj++];
rc->ycm=rha[kj++];
rc->zcm=rha[kj++];
if(rank==numprocs-1) rc->xcm+=(double)L;
rc->Vxcm=rha[kj++];
rc->Vycm=rha[kj++];
rc->Vzcm=rha[kj++];
rc->wx=rha[kj++];
rc->wy=rha[kj++];
rc->wz=rha[kj++];
rc->ex=rha[kj++];
rc->ey=rha[kj++];
rc->ez=rha[kj++];
rc->Momx=0.0;
rc->Momy=0.0;
rc->Momz=0.0;
rc->Amomx=0.0;
rc->Amomy=0.0;
rc->Amomz=0.0;
}
}
///*****************************************//
ki = (int)rhb[0];
kj = 1;
while( kj < ki){
i=(int)rhb[kj++];
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip != 2)continue;
rc->id = i;
rc->ip = 1;
rc->xcm=rhb[kj++];
rc->ycm=rhb[kj++];
rc->zcm=rhb[kj++];
if(rank==0) rc->xcm-=(double)L;
rc->Vxcm=rhb[kj++];
rc->Vycm=rhb[kj++];
rc->Vzcm=rhb[kj++];
rc->wx=rhb[kj++];
rc->wy=rhb[kj++];
rc->wz=rhb[kj++];
rc->ex=rhb[kj++];
rc->ey=rhb[kj++];
rc->ez=rhb[kj++];
rc->Momx=0.0;
rc->Momy=0.0;
rc->Momz=0.0;
rc->Amomx=0.0;
rc->Amomy=0.0;
rc->Amomz=0.0;
ic = Nrbcp+10;
}
if(ic < Nrbcp+3)
{
ic = Nrbcp;
Nrbcp++;
rc=rbc+ic;
rc->id = i;
rc->ip = 1;
rc->xcm=rhb[kj++];
rc->ycm=rhb[kj++];
rc->zcm=rhb[kj++];
if(rank==0) rc->xcm-=(double)L;
rc->Vxcm=rhb[kj++];
rc->Vycm=rhb[kj++];
rc->Vzcm=rhb[kj++];
rc->wx=rhb[kj++];
rc->wy=rhb[kj++];
rc->wz=rhb[kj++];
rc->ex=rhb[kj++];
rc->ey=rhb[kj++];
rc->ez=rhb[kj++];
rc->Momx=0.0;
rc->Momy=0.0;
rc->Momz=0.0;
rc->Amomx=0.0;
rc->Amomy=0.0;
rc->Amomz=0.0;
}
}
///*****************************************//
ki = (int)rpsha[0];
kj = 1;
while( kj < ki){
i=(int)rpsha[kj++];
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2) continue;
if(rc->id != i)continue;
if(rc->ip != 1)
{
printf("rankkkkkkkkkkkkb=%d xcm=%e xer=%d xsl=%d ic=%d ip=%d kj=%d id=%d \n",rank, rc->xcm,xer,xsl,ic,rc->ip,kj,rc->id);
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_ip2");
printf(" rank=%i ic=%i id=%i ip=%i \n",rank,ic,i,rc->ip);
exit(1);
}
rc->ip = 2;
ic= Nrbcp+10;
}
if(ic < Nrbcp+3)
{
printf("lkeERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_ip5");
printf(" rank=%i id=%i xsl=%i xer=%i \n",rank,i,xsl,xer);
exit(1);
}
}
ki = (int)rpshb[0];
kj = 1;
while( kj < ki){
i=(int)rpshb[kj++];
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2) continue;
if(rc->id != i)continue;
if(rc->ip != 1)
{
printf("rankkkkkkkkkkkkb2=%d xcm=%e xer=%d xsl=%d ic=%d ip=%d kj=%d id=%d \n",rank, rc->xcm,xer,xsl,ic,rc->ip,kj,rc->id);
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_ip43");
printf(" rank=%i ic=%i id=%i ip=%i \n",rank,ic,i,rc->ip);
exit(1);
}
rc->ip = 2;
ic= Nrbcp+10;
}
if(ic < Nrbcp+3)
{
printf("htrERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_ip6");
printf(" rank=%i id=%i xsl=%i xer=%i \n",rank,i,xsl,xer);
exit(1);
}
}
///*****************************************//
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2) continue;
rbp=sqrt((ylc-rc->ycm)*(ylc-rc->ycm)+(zlc-rc->zcm)*(zlc-rc->zcm));
if(rbp+Rrbc >= Lr0)
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_rbp");
printf(" rank=%i ic=%i ip=%i rbp=%e \n",rank,ic,rc->ip,rbp);
exit(1);
}
}
ki=0;
kj=0;
rhu[ki++] = 0.0;
rhv[kj++] = 0.0;
rha[0] = 0.0;
rhb[0] = 0.0;
for(i=0;i<Nrbcp;i++)
{
rc=rbc+i;
if(rc->ip == 2) continue;
if( rc->xcm < xsl-Rrbc-.5)
{
rc->ip = 2;
rhu[ki++]=(double)rc->id;
rhu[ki++]=rc->xcm;
rhu[ki++]=rc->ycm;
rhu[ki++]=rc->zcm;
rhu[ki++]=rc->Vxcm;
rhu[ki++]=rc->Vycm;
rhu[ki++]=rc->Vzcm;
rhu[ki++]=rc->wx;
rhu[ki++]=rc->wy;
rhu[ki++]=rc->wz;
rhu[ki++]=rc->ex;
rhu[ki++]=rc->ey;
rhu[ki++]=rc->ez;
}
else if(rc->xcm > xer+Rrbc+.5)
{
rc->ip = 2;
rhv[kj++]=(double)rc->id;
rhv[kj++]=rc->xcm;
rhv[kj++]=rc->ycm;
rhv[kj++]=rc->zcm;
rhv[kj++]=rc->Vxcm;
rhv[kj++]=rc->Vycm;
rhv[kj++]=rc->Vzcm;
rhv[kj++]=rc->wx;
rhv[kj++]=rc->wy;
rhv[kj++]=rc->wz;
rhv[kj++]=rc->ex;
rhv[kj++]=rc->ey;
rhv[kj++]=rc->ez;
}
}
if(ki == 1) ki=0;
if(kj == 1) kj=0;
rhu[0]=(double)ki;
rhv[0]=(double)kj;
if(numprocs > 1){
MPI_Sendrecv(&rhu[0],ki,MPI_DOUBLE,left,197,&rha[0],5000,MPI_DOUBLE,right,197,comm1d,&status);
MPI_Sendrecv(&rhv[0],kj,MPI_DOUBLE,right,198,&rhb[0],5000,MPI_DOUBLE,left,198,comm1d,&status);
}
///*****************************************//
ki = (int)rha[0];
kj = 1;
while( kj < ki){
i=(int)rha[kj++];
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2) continue;
if(rc->id != i)continue;
rc->ip = 0;
rc->xcm=rha[kj++];
rc->ycm=rha[kj++];
rc->zcm=rha[kj++];
if(rank==numprocs-1) rc->xcm+=(double)L;
rc->Vxcm=rha[kj++];
rc->Vycm=rha[kj++];
rc->Vzcm=rha[kj++];
rc->wx=rha[kj++];
rc->wy=rha[kj++];
rc->wz=rha[kj++];
rc->ex=rha[kj++];
rc->ey=rha[kj++];
rc->ez=rha[kj++];
ic = Nrbcp+10;
}
if(ic < Nrbcp+3)
{
printf("lkeERRRRRfdgRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_ip5");
printf(" rank=%i id=%i xsl=%i xer=%i \n",rank,i,xsl,xer);
exit(1);
}
}
///*****************************************//
ki = (int)rhb[0];
kj = 1;
while( kj < ki){
i=(int)rhb[kj++];
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2) continue;
if(rc->id != i)continue;
rc->ip = 0;
rc->xcm=rhb[kj++];
rc->ycm=rhb[kj++];
rc->zcm=rhb[kj++];
if(rank==0) rc->xcm-=(double)L;
rc->Vxcm=rhb[kj++];
rc->Vycm=rhb[kj++];
rc->Vzcm=rhb[kj++];
rc->wx=rhb[kj++];
rc->wy=rhb[kj++];
rc->wz=rhb[kj++];
rc->ex=rhb[kj++];
rc->ey=rhb[kj++];
rc->ez=rhb[kj++];
ic = Nrbcp+10;
}
if(ic < Nrbcp+3)
{
printf("lkeERRRRRfdgRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_ip5");
printf(" rank=%i id=%i xsl=%i xer=%i \n",rank,i,xsl,xer);
exit(1);
}
}
//***********************************************//
for(i=0;i<Nrbcp;i++)
{
rc=rbc+i;
if(rc->ip == 2) continue;
for(ic=0;ic<Nrbcp;ic++)
{
if(i == ic) continue;
rc2=rbc+ic;
if(rc2->ip == 2) continue;
if(rc->id == rc2->id) continue;
rctoc=sqrt((rc->xcm-rc2->xcm)*(rc->xcm-rc2->xcm)+(rc->ycm-rc2->ycm)*(rc->ycm-rc2->ycm)+(rc->zcm-rc2->zcm)*(rc->zcm-rc2->zcm));
if(rctoc < 2.0*Rrbc)
{
xxcm=rc->xcm-rc2->xcm;
yycm=rc->ycm-rc2->ycm;
zzcm=rc->zcm-rc2->zcm;
if(rc->Vxcm*xxcm < 0.0)rc->Vxcm=-rc->Vxcm;
if(rc->Vycm*yycm < 0.0)rc->Vycm=-rc->Vycm;
if(rc->Vzcm*zzcm < 0.0)rc->Vzcm=-rc->Vzcm;
if(rc2->Vxcm*xxcm > 0.0)rc2->Vxcm=-rc2->Vxcm;
if(rc2->Vycm*yycm > 0.0)rc2->Vycm=-rc2->Vycm;
if(rc2->Vzcm*zzcm > 0.0)rc2->Vzcm=-rc2->Vzcm;
if(rctoc < 1.7*Rrbc)
{
if(rc->id > rc2->id)rc2->ip = 2;
else rc->ip = 2;
}
// exit(1);
}
}
}
}
//***********************************************//
}
double gaussianrandom()
{
double x,y,r2;
do
{
x=-1.+2.*drand48();
y=-1.+2.*drand48();
r2=x*x+y*y;
}
while(r2>=1.0);
return(SRTEMP*y*sqrt(-2.0*log(r2)/r2));
}
void calculateforces()
{
unsigned long int i;
struct aftr *a;
calculateroundspring();
bodyspring();
cenbenspring();
bendbodyforce2();
forcebend11();
for(i=0;i<Naf;i++)
{
a=at+i;
if(a->typ == 0){
a->ax=a->fx;
a->ay=a->fy;
a->az=a->fz;
a->vx+=0.5*dtaf*a->ax;
a->vy+=0.5*dtaf*a->ay;
a->vz+=0.5*dtaf*a->az;
}
a->fx=a->fy=a->fz=0;
}
}
void calculateroundspring()
{
unsigned long int i,j,k;
double dam1x,dam1y,dam1z,d2,d,inv_d,fx,fy,fz,l0;
double pe,tfx,tfy,tfz;
struct aftr *a1,*a2;
tfx=tfy=tfz=0;
for(i=0;i<length;i++)
{
k=i;
j=0;
do
{
if(j==0)
{
a1=(at+k);
a2=(at+k+length*(j+1));
}
else
{
a1=a2;
if(j<npoints-1)
a2=(at+k+length*(j+1));
else
a2=(at+k);
}
j++;
if((a1->typ != 0) && (a2->typ != 0))continue;
if((a2->typ == 2) || (a1->typ == 2))
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRR6");
printf(" rank=%i i=%i a1->typ=%i a2->typ=%i a1->xreal=%le xsl=%i xer=%i \n",rank,i,a1->typ,a2->typ,a1->xreal,xsl,xer);
exit(1);
}
l0=a1->round;
dam1x=(a1->xreal-a2->xreal);
dam1y=(a1->yreal-a2->yreal);
dam1z=(a1->zreal-a2->zreal);
d2=dam1x*dam1x+dam1y*dam1y+dam1z*dam1z;
d=sqrt(d2);
inv_d=1./d;
fx=fy=fz=0;
if(d>0)
{
fx=k0*(d-l0)*dam1x*inv_d*kround;
fy=k0*(d-l0)*dam1y*inv_d*kround;
fz=k0*(d-l0)*dam1z*inv_d*kround;
}
a1->fx+=-fx;
a1->fy+=-fy;
a1->fz+=-fz;
a2->fx+=fx;
a2->fy+=fy;
a2->fz+=fz;
}
while(j<npoints);
}
}
void bodyspring()
{
unsigned long int i,j;
double dam1x,dam1y,dam1z,d2,d,inv_d,fx,fy,fz,l0;
struct aftr *a1,*a2;
i=0;
do
{
for(j=0;j<length-1;j++)
{
a1=at+(i)*length+j;
a2=at+(i)*length+j+1;
if((a1->typ != 0) && (a2->typ != 0))continue;
if((a2->typ == 2) || (a1->typ == 2))
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRR7");
printf(" rank=%i i=%i a1->typ=%i a2->typ=%i a1->xreal=%le xsl=%i xer=%i \n",rank,i,a1->typ,a2->typ,a1->xreal,xsl,xer);
exit(1);
}
l0=a1->body;
dam1x=(a1->xreal-a2->xreal);
dam1y=(a1->yreal-a2->yreal);
dam1z=(a1->zreal-a2->zreal);
//d2=dist2(a1->xreal,a2->xreal,a1->yreal,a2->yreal,a1->zreal,a2->zreal);
d2=dam1x*dam1x+dam1y*dam1y+dam1z*dam1z;
d=sqrt(d2);
inv_d=1./d;
fx=fy=fz=0;
if(d>0)
{
fx=k0*(d-l0)*dam1x*inv_d*kbody;
fy=k0*(d-l0)*dam1y*inv_d*kbody;
fz=k0*(d-l0)*dam1z*inv_d*kbody;
}
a1->fx+=-fx;
a1->fy+=-fy;
a1->fz+=-fz;
a2->fx+=fx;
a2->fy+=fy;
a2->fz+=fz;
}
i++;
}
while(i<npoints);
//printf("\n\n");
//exit(1);
//printf(" %ld\n",num);
}
void cenbenspring()
{
unsigned long int i,j,k,m;
double dam1x,dam1y,dam1z,fx,fy,fz,l0,d2,d,inv_d;
struct aftr *a1,*a2;
for(i=0;i<length;i++)
{
k=i;
//k=length-1;
j=0;
do
{
a1=(at+(k+j*length));
a2=(at+k+length*(j+5));
j++;
if((a1->typ != 0) && (a2->typ != 0))continue;
if((a2->typ == 2) || (a1->typ == 2))
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRR8");
printf(" rank=%i i=%i a1->typ=%i a2->typ=%i a1->xreal=%le xsl=%i xer=%i \n",rank,i,a1->typ,a2->typ,a1->xreal,xsl,xer);
exit(1);
}
l0=a1->cenben;
dam1x=(a1->xreal-a2->xreal);
dam1y=(a1->yreal-a2->yreal);
dam1z=(a1->zreal-a2->zreal);
//d2=dist2(a1->xreal,a2->xreal,a1->yreal,a2->yreal,a1->zreal,a2->zreal);
d2=dam1x*dam1x+dam1y*dam1y+dam1z*dam1z;
d=sqrt(d2);
inv_d=1./d;
fx=fy=fz=0;
if(d>0)
{
fx=k0*(d-l0)*dam1x*inv_d*kcenben;
fy=k0*(d-l0)*dam1y*inv_d*kcenben;
fz=k0*(d-l0)*dam1z*inv_d*kcenben;
}
a1->fx+=-fx;
a1->fy+=-fy;
a1->fz+=-fz;
a2->fx+=fx;
a2->fy+=fy;
a2->fz+=fz;
}
while(j<npoints-5);
//printf("\n\n");
}
//exit(1);
}
void bendbodyforce2()
{
unsigned long int i,j,k;
double mrix,mriy,mriz,mrip1x,mrip1y,mrip1z;
double rix,riy,riz,rip1x,rip1y,rip1z,inv_ri,inv_rip1,inv_mri,inv_mrip1;
double inv_delta,cp,cm,delta,low;
double fx,fy,fz,tfx,tfy,tfz,ttx,tty,ttz,Tx,Ty,Tz;
struct aftr *a1,*a2,*a3;
struct CM *cnmo;
delta=1.e-6;
inv_delta=1./delta;
//cnmo=cm+0;
//printf("%le\n",cnmo->vx);
//exit(1);
j=0;
do
{
low=1.;
for(i=0;i<length-2;i++)
{
a1=at+j*length+i;
a2=at+j*length+i+1;
a3=at+j*length+i+2;
low=(a2->r*a2->r)/(0.78*0.78);
// if(i>9)
// low*=reducedbend;
if((a1->typ != 0) && (a2->typ != 0) && (a3->typ != 0))continue;
if((a1->typ == 2) || (a2->typ == 2) || (a3->typ == 2))
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRR9");
printf(" rank=%i i=%i a1->typ=%i a2->typ=%i a3->typ=%i xsl=%i xer=%i \n",rank,i,a1->typ,a2->typ,a3->typ,xsl,xer);
exit(1);
}
if(a1->typ == 0){
rix=a2->xreal-(a1->xreal+delta);
riy=a2->yreal-a1->yreal;
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal-a2->zreal;
mrix=a2->xreal-(a1->xreal-delta);
mriy=a2->yreal-a1->yreal;
mriz=a2->zreal-a1->zreal;
inv_ri=1./sqrt(rix*rix+riy*riy+riz*riz);
inv_rip1=1./sqrt(rip1x*rip1x+rip1y*rip1y+rip1z*rip1z);
inv_mri=1./sqrt(mrix*mrix+mriy*mriy+mriz*mriz);
rix*=inv_ri;
riy*=inv_ri;
riz*=inv_ri;
rip1x*=inv_rip1;
rip1y*=inv_rip1;
rip1z*=inv_rip1;
mrix*=inv_mri;
mriy*=inv_mri;
mriz*=inv_mri;
mrip1x=rip1x;
mrip1y=rip1y;
mrip1z=rip1z;
cp=rix*rip1x+riy*rip1y+riz*rip1z;
cm=mrix*mrip1x+mriy*mrip1y+mriz*mrip1z;
a1->epx+=0.5*kbend*kmi*(a2->cangle1-cp)*(a2->cangle1-cp)*low;
a1->emx+=0.5*kbend*kmi*(a2->cangle1-cm)*(a2->cangle1-cm)*low;
rix=a2->xreal-a1->xreal;
riy=a2->yreal-a1->yreal-delta;
riz=a2->zreal-a1->zreal;
mrix=a2->xreal-a1->xreal;
mriy=a2->yreal-a1->yreal+delta;
mriz=a2->zreal-a1->zreal;
inv_ri=1./sqrt(rix*rix+riy*riy+riz*riz);
inv_mri=1./sqrt(mrix*mrix+mriy*mriy+mriz*mriz);
rix*=inv_ri;
riy*=inv_ri;
riz*=inv_ri;
mrix*=inv_mri;
mriy*=inv_mri;
mriz*=inv_mri;
cp=rix*rip1x+riy*rip1y+riz*rip1z;
cm=mrix*mrip1x+mriy*mrip1y+mriz*mrip1z;
a1->epy+=0.5*kbend*kmi*(cp-a2->cangle1)*(cp-a2->cangle1)*low;
a1->emy+=0.5*kbend*kmi*(cm-a2->cangle1)*(cm-a2->cangle1)*low;
rix=a2->xreal-a1->xreal;
riy=a2->yreal-a1->yreal;
riz=a2->zreal-a1->zreal-delta;
mrix=a2->xreal-a1->xreal;
mriy=a2->yreal-a1->yreal;
mriz=a2->zreal-a1->zreal+delta;
inv_ri=1./sqrt(rix*rix+riy*riy+riz*riz);
inv_mri=1./sqrt(mrix*mrix+mriy*mriy+mriz*mriz);
rix*=inv_ri;
riy*=inv_ri;
riz*=inv_ri;
mrix*=inv_mri;
mriy*=inv_mri;
mriz*=inv_mri;
cp=rix*rip1x+riy*rip1y+riz*rip1z;
cm=mrix*mrip1x+mriy*mrip1y+mriz*mrip1z;
a1->epz+=0.5*kbend*kmi*(cp-a2->cangle1)*(cp-a2->cangle1)*low;
a1->emz+=0.5*kbend*kmi*(cm-a2->cangle1)*(cm-a2->cangle1)*low;
}
if(a2->typ == 0){
rix=a2->xreal+delta-a1->xreal;
riy=a2->yreal-a1->yreal;
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal-a2->xreal-delta;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal-a2->zreal;
mrix=a2->xreal-delta-a1->xreal;
mriy=a2->yreal-a1->yreal;
mriz=a2->zreal-a1->zreal;
mrip1x=a3->xreal-a2->xreal+delta;
mrip1y=a3->yreal-a2->yreal;
mrip1z=a3->zreal-a2->zreal;
inv_ri=1./sqrt(rix*rix+riy*riy+riz*riz);
inv_rip1=1./sqrt(rip1x*rip1x+rip1y*rip1y+rip1z*rip1z);
inv_mri=1./sqrt(mrix*mrix+mriy*mriy+mriz*mriz);
inv_mrip1=1./sqrt(mrip1x*mrip1x+mrip1y*mrip1y+mrip1z*mrip1z);
rix*=inv_ri;
riy*=inv_ri;
riz*=inv_ri;
rip1x*=inv_rip1;
rip1y*=inv_rip1;
rip1z*=inv_rip1;
mrix*=inv_mri;
mriy*=inv_mri;
mriz*=inv_mri;
mrip1x*=inv_mrip1;
mrip1y*=inv_mrip1;
mrip1z*=inv_mrip1;
cp=rix*rip1x+riy*rip1y+riz*rip1z;
cm=mrix*mrip1x+mriy*mrip1y+mriz*mrip1z;
a2->epx+=0.5*kbend*kmi*(a2->cangle1-cp)*(a2->cangle1-cp)*low;
a2->emx+=0.5*kbend*kmi*(a2->cangle1-cm)*(a2->cangle1-cm)*low;
rix=a2->xreal-a1->xreal;
riy=a2->yreal+delta-a1->yreal;
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal-a2->yreal-delta;
rip1z=a3->zreal-a2->zreal;
mrix=a2->xreal-a1->xreal;
mriy=a2->yreal-delta-a1->yreal;
mriz=a2->zreal-a1->zreal;
mrip1x=a3->xreal-a2->xreal;
mrip1y=a3->yreal-a2->yreal+delta;
mrip1z=a3->zreal-a2->zreal;
inv_ri=1./sqrt(rix*rix+riy*riy+riz*riz);
inv_rip1=1./sqrt(rip1x*rip1x+rip1y*rip1y+rip1z*rip1z);
inv_mri=1./sqrt(mrix*mrix+mriy*mriy+mriz*mriz);
inv_mrip1=1./sqrt(mrip1x*mrip1x+mrip1y*mrip1y+mrip1z*mrip1z);
rix*=inv_ri;
riy*=inv_ri;
riz*=inv_ri;
rip1x*=inv_rip1;
rip1y*=inv_rip1;
rip1z*=inv_rip1;
mrix*=inv_mri;
mriy*=inv_mri;
mriz*=inv_mri;
mrip1x*=inv_mrip1;
mrip1y*=inv_mrip1;
mrip1z*=inv_mrip1;
cp=rix*rip1x+riy*rip1y+riz*rip1z;
cm=mrix*mrip1x+mriy*mrip1y+mriz*mrip1z;
a2->epy+=0.5*kbend*kmi*(cp-a2->cangle1)*(cp-a2->cangle1)*low;
a2->emy+=0.5*kbend*kmi*(cm-a2->cangle1)*(cm-a2->cangle1)*low;
rix=a2->xreal-a1->xreal;
riy=a2->yreal-a1->yreal;
riz=a2->zreal+delta-a1->zreal;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal-a2->zreal-delta;
mrix=a2->xreal-a1->xreal;
mriy=a2->yreal-a1->yreal;
mriz=a2->zreal-delta-a1->zreal;
mrip1x=a3->xreal-a2->xreal;
mrip1y=a3->yreal-a2->yreal;
mrip1z=a3->zreal-a2->zreal+delta;
inv_ri=1./sqrt(rix*rix+riy*riy+riz*riz);
inv_rip1=1./sqrt(rip1x*rip1x+rip1y*rip1y+rip1z*rip1z);
inv_mri=1./sqrt(mrix*mrix+mriy*mriy+mriz*mriz);
inv_mrip1=1./sqrt(mrip1x*mrip1x+mrip1y*mrip1y+mrip1z*mrip1z);
rix*=inv_ri;
riy*=inv_ri;
riz*=inv_ri;
rip1x*=inv_rip1;
rip1y*=inv_rip1;
rip1z*=inv_rip1;
mrix*=inv_mri;
mriy*=inv_mri;
mriz*=inv_mri;
mrip1x*=inv_mrip1;
mrip1y*=inv_mrip1;
mrip1z*=inv_mrip1;
cp=rix*rip1x+riy*rip1y+riz*rip1z;
cm=mrix*mrip1x+mriy*mrip1y+mriz*mrip1z;
a2->epz+=0.5*kbend*kmi*(cp-a2->cangle1)*(cp-a2->cangle1)*low;
a2->emz+=0.5*kbend*kmi*(cm-a2->cangle1)*(cm-a2->cangle1)*low;
}
if(a3->typ == 0){
rix=a2->xreal-a1->xreal;
riy=a2->yreal-a1->yreal;
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal+delta-a2->xreal;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal-a2->zreal;
mrip1x=a3->xreal-delta-a2->xreal;
mrip1y=a3->yreal-a2->yreal;
mrip1z=a3->zreal-a2->zreal;
inv_ri=1./sqrt(rix*rix+riy*riy+riz*riz);
inv_rip1=1./sqrt(rip1x*rip1x+rip1y*rip1y+rip1z*rip1z);
inv_mrip1=1./sqrt(mrip1x*mrip1x+mrip1y*mrip1y+mrip1z*mrip1z);
rix*=inv_ri;
riy*=inv_ri;
riz*=inv_ri;
rip1x*=inv_rip1;
rip1y*=inv_rip1;
rip1z*=inv_rip1;
mrix=rix;
mriy=riy;
mriz=riz;
mrip1x*=inv_mrip1;
mrip1y*=inv_mrip1;
mrip1z*=inv_mrip1;
cp=rix*rip1x+riy*rip1y+riz*rip1z;
cm=mrix*mrip1x+mriy*mrip1y+mriz*mrip1z;
a3->epx+=0.5*kbend*kmi*(a2->cangle1-cp)*(a2->cangle1-cp)*low;
a3->emx+=0.5*kbend*kmi*(a2->cangle1-cm)*(a2->cangle1-cm)*low;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal+delta-a2->yreal;
rip1z=a3->zreal-a2->zreal;
mrip1x=a3->xreal-a2->xreal;
mrip1y=a3->yreal-delta-a2->yreal;
mrip1z=a3->zreal-a2->zreal;
inv_rip1=1./sqrt(rip1x*rip1x+rip1y*rip1y+rip1z*rip1z);
inv_mrip1=1./sqrt(mrip1x*mrip1x+mrip1y*mrip1y+mrip1z*mrip1z);
rip1x*=inv_rip1;
rip1y*=inv_rip1;
rip1z*=inv_rip1;
mrip1x*=inv_mrip1;
mrip1y*=inv_mrip1;
mrip1z*=inv_mrip1;
cp=rix*rip1x+riy*rip1y+riz*rip1z;
cm=mrix*mrip1x+mriy*mrip1y+mriz*mrip1z;
a3->epy+=0.5*kbend*kmi*(cp-a2->cangle1)*(cp-a2->cangle1)*low;
a3->emy+=0.5*kbend*kmi*(cm-a2->cangle1)*(cm-a2->cangle1)*low;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal+delta-a2->zreal;
mrip1x=a3->xreal-a2->xreal;
mrip1y=a3->yreal-a2->yreal;
mrip1z=a3->zreal-delta-a2->zreal;
inv_rip1=1./sqrt(rip1x*rip1x+rip1y*rip1y+rip1z*rip1z);
inv_mrip1=1./sqrt(mrip1x*mrip1x+mrip1y*mrip1y+mrip1z*mrip1z);
rip1x*=inv_rip1;
rip1y*=inv_rip1;
rip1z*=inv_rip1;
mrip1x*=inv_mrip1;
mrip1y*=inv_mrip1;
mrip1z*=inv_mrip1;
cp=rix*rip1x+riy*rip1y+riz*rip1z;
cm=mrix*mrip1x+mriy*mrip1y+mriz*mrip1z;
a3->epz+=0.5*kbend*kmi*(cp-a2->cangle1)*(cp-a2->cangle1)*low;
a3->emz+=0.5*kbend*kmi*(cm-a2->cangle1)*(cm-a2->cangle1)*low;
}
}
//printf("\n\n");
j++;
}
while(j<npoints);
tfx=tfy=tfz=ttx=tty=ttz=Tx=Ty=Tz=0;
for(i=0;i<Naf;i++)
{
a1=at+i;
if(a1->typ == 0){
fx=-(a1->epx-a1->emx)*0.5*inv_delta;
fy=-(a1->epy-a1->emy)*0.5*inv_delta;
fz=-(a1->epz-a1->emz)*0.5*inv_delta;
a1->fx+=fx;
a1->fy+=fy;
a1->fz+=fz;
}
a1->epx=a1->emx=a1->epy=a1->emy=a1->epz=a1->emz=0;
}
//printf("%le\t%le\t%le\n",tfx,tfy,tfz);
//exit(1);
}
void forcebend11()
{
unsigned long int i,j,end,n1,n2,st;
double rix,riy,riz,rip1x,rip1y,rip1z;
double mrix,mriy,mriz,mrip1x,mrip1y,mrip1z;
double rtx,rty,rtz,ux,uy,uz,tx,ty,tz,bx,by,bz,inv_d;
double epx,epy,epz,emx,emy,emz,inv_delta;
double D,g,l0,a,b,delta,fx,tfx,fy,fz,tfy,tfz;
double ttx,tty,ttz,Tx,Ty,Tz,wv11,wv22,h;
double px,py,pz;
struct aftr *a1,*a2,*a3,*s,*a4;
delta=1.e-6;
inv_delta=1./delta;
s=at+1;
//epx=epy=epz=emx=emy=emz=tfx=0;
n1=7*length;
n2=3*length;
end=length-2;
st=2;
//wv11=2.*PI/tlength*1.5;
wv11=wv;
h=gamma1;
a1=at+st;
for(i=st;i<end;i++)
{
if(i==st)
{
a2=a1->helix[0];
a3=a2->helix[1];
}
else
{
a1=a2;
a2=a1->helix[1];
a3=a2->helix[1];
}
if((a1->typ != 0) && (a2->typ != 0) && (a3->typ != 0))continue;
if((a1->typ == 2) || (a2->typ == 2) || (a3->typ == 2))
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRR10");
printf(" rank=%i i=%i a1->typ=%i a2->typ=%i a3->typ=%i xsl=%i xer=%i \n",rank,i,a1->typ,a2->typ,a3->typ,xsl,xer);
exit(1);
}
D=a2->D;
g=avgspcur+h*(sin(wv11*D+fr*totdt));
if(a1->typ == 0){
tx=a1->xreal+delta-a2->xreal;
ty=a1->yreal-a2->yreal;
tz=a1->zreal-a2->zreal;
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
rix=a2->xreal-(a1->xreal+delta);
riy=a2->yreal-a1->yreal;
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal-a2->zreal;
mrix=a2->xreal-(a1->xreal-delta);
mriy=a2->yreal-a1->yreal;
mriz=a2->zreal-a1->zreal;
mrip1x=a3->xreal-a2->xreal;
mrip1y=a3->yreal-a2->yreal;
mrip1z=a3->zreal-a2->zreal;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
a1->epx+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
tx=a1->xreal-delta-a2->xreal;
ty=a1->yreal-a2->yreal;
tz=a1->zreal-a2->zreal;
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
a1->emx+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
if(a2->typ == 0){
rix=a2->xreal+delta-a1->xreal;
riy=a2->yreal-a1->yreal;
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal-(a2->xreal+delta);
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal-a2->zreal;
mrix=a2->xreal-delta-a1->xreal;
mriy=a2->yreal-a1->yreal;
mriz=a2->zreal-a1->zreal;
mrip1x=a3->xreal-a2->xreal+delta;
mrip1y=a3->yreal-a2->yreal;
mrip1z=a3->zreal-a2->zreal;
tx=a1->xreal-(a2->xreal+delta);
ty=a1->yreal-a2->yreal;
tz=a1->zreal-a2->zreal;
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
a2->epx+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
tx=a1->xreal-(a2->xreal-delta);
ty=a1->yreal-a2->yreal;
tz=a1->zreal-a2->zreal;
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
a2->emx+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
if(a3->typ == 0){
rix=a2->xreal-a1->xreal;
riy=a2->yreal-a1->yreal;
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal+delta-a2->xreal;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal-a2->zreal;
mrix=a2->xreal-a1->xreal;
mriy=a2->yreal-a1->yreal;
mriz=a2->zreal-a1->zreal;
mrip1x=a3->xreal-delta-a2->xreal;
mrip1y=a3->yreal-a2->yreal;
mrip1z=a3->zreal-a2->zreal;
tx=a1->xreal-a2->xreal;
ty=a1->yreal-a2->yreal;
tz=a1->zreal-a2->zreal;
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
a3->epx+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
tx=a1->xreal-a2->xreal;
ty=a1->yreal-a2->yreal;
tz=a1->zreal-a2->zreal;
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
a3->emx+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
if(a1->typ == 0){
rix=a2->xreal-a1->xreal;
riy=a2->yreal-(a1->yreal+delta);
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal-a2->zreal;
mrix=a2->xreal-a1->xreal;
mriy=a2->yreal-(a1->yreal-delta);
mriz=a2->zreal-a1->zreal;
mrip1x=a3->xreal-a2->xreal;
mrip1y=a3->yreal-a2->yreal;
mrip1z=a3->zreal-a2->zreal;
tx=a1->xreal-a2->xreal;
ty=a1->yreal+delta-a2->yreal;
tz=a1->zreal-a2->zreal;
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
a1->epy+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
tx=a1->xreal-a2->xreal;
ty=a1->yreal-delta-a2->yreal;
tz=a1->zreal-a2->zreal;
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
a1->emy+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
if(a2->typ == 0){
rix=a2->xreal-a1->xreal;
riy=a2->yreal+delta-a1->yreal;
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal-a2->yreal-delta;
rip1z=a3->zreal-a2->zreal;
mrix=a2->xreal-a1->xreal;
mriy=a2->yreal-delta-a1->yreal;
mriz=a2->zreal-a1->zreal;
mrip1x=a3->xreal-a2->xreal;
mrip1y=a3->yreal-a2->yreal+delta;
mrip1z=a3->zreal-a2->zreal;
tx=a1->xreal-a2->xreal;
ty=a1->yreal-(a2->yreal+delta);
tz=a1->zreal-a2->zreal;
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
a2->epy+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
tx=a1->xreal-a2->xreal;
ty=a1->yreal-(a2->yreal-delta);
tz=a1->zreal-a2->zreal;
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
a2->emy+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
if(a3->typ == 0){
rix=a2->xreal-a1->xreal;
riy=a2->yreal-a1->yreal;
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal+delta-a2->yreal;
rip1z=a3->zreal-a2->zreal;
mrix=a2->xreal-a1->xreal;
mriy=a2->yreal-a1->yreal;
mriz=a2->zreal-a1->zreal;
mrip1x=a3->xreal-a2->xreal;
mrip1y=a3->yreal-delta-a2->yreal;
mrip1z=a3->zreal-a2->zreal;
tx=a1->xreal-a2->xreal;
ty=a1->yreal-a2->yreal;
tz=a1->zreal-a2->zreal;
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
a3->epy+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
a3->emy+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
if(a1->typ == 0){
rix=a2->xreal-a1->xreal;
riy=a2->yreal-a1->yreal;
riz=a2->zreal-(a1->zreal+delta);
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal-a2->zreal;
mrix=a2->xreal-a1->xreal;
mriy=a2->yreal-a1->yreal;
mriz=a2->zreal-(a1->zreal-delta);
mrip1x=a3->xreal-a2->xreal;
mrip1y=a3->yreal-a2->yreal;
mrip1z=a3->zreal-a2->zreal;
tx=a1->xreal-a2->xreal;
ty=a1->yreal-a2->yreal;
tz=a1->zreal+delta-a2->zreal;
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
a1->epz+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
tx=a1->xreal-a2->xreal;
ty=a1->yreal-a2->yreal;
tz=a1->zreal-delta-a2->zreal;
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
a1->emz+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
if(a2->typ == 0){
rix=a2->xreal-a1->xreal;
riy=a2->yreal-a1->yreal;
riz=a2->zreal+delta-a1->zreal;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal-a2->zreal-delta;
mrix=a2->xreal-a1->xreal;
mriy=a2->yreal-a1->yreal;
mriz=a2->zreal-delta-a1->zreal;
mrip1x=a3->xreal-a2->xreal;
mrip1y=a3->yreal-a2->yreal;
mrip1z=a3->zreal-a2->zreal+delta;
tx=a1->xreal-a2->xreal;
ty=a1->yreal-a2->yreal;
tz=a1->zreal-(a2->zreal+delta);
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
a2->epz+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
tx=a1->xreal-a2->xreal;
ty=a1->yreal-a2->yreal;
tz=a1->zreal-(a2->zreal-delta);
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
a2->emz+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
if(a3->typ == 0){
rix=a2->xreal-a1->xreal;
riy=a2->yreal-a1->yreal;
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal+delta-a2->zreal;
mrix=a2->xreal-a1->xreal;
mriy=a2->yreal-a1->yreal;
mriz=a2->zreal-a1->zreal;
mrip1x=a3->xreal-a2->xreal;
mrip1y=a3->yreal-a2->yreal;
mrip1z=a3->zreal-delta-a2->zreal;
tx=a1->xreal-a2->xreal;
ty=a1->yreal-a2->yreal;
tz=a1->zreal-a2->zreal;
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
a3->epz+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
a3->emz+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
//printf("%ld\t%ld\t%ld\t%ld\t%ld\n",a1->n,a2->n,a3->n,(at+a2->n1)->n,(at+a2->n2)->n);
//printf("%le\t%le\t%le\t%le\t%le\t%le\n",a2->xreal,a2->yreal,a2->zreal,ux,uy,uz);
}
//exit(1);
//D=0;
a1=at+st;
for(i=st;i<end;i++)
{
if(i==st)
{
a2=a1->helix[0];
a3=a2->helix[1];
}
else
{
a1=a2;
a2=a1->helix[1];
a3=a2->helix[1];
}
if(((at+a2->n1)->typ != 0) && ((at+a2->n2)->typ != 0) )continue;
if(((at+a2->n1)->typ == 2) || ((at+a2->n2)->typ == 2) || (a1->typ == 2) || (a2->typ == 2) || (a3->typ == 2))
{
printf("ERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRR12");
printf(" rank=%i i=%i a1->typ=%i a2->typ=%i a3->typ=%i (at+a2->n1)->typ=%i (at+a2->n2)->typ=%i \n",rank,i,a1->typ,a2->typ,a3->typ,(at+a2->n1)->typ,(at+a2->n2)->typ);
exit(1);
}
D=a2->D;
h=gamma1;
g=avgspcur+h*(sin(wv11*D+fr*totdt));
rix=a2->xreal-a1->xreal;
riy=a2->yreal-a1->yreal;
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal-a2->zreal;
mrix=a2->xreal-a1->xreal;
mriy=a2->yreal-a1->yreal;
mriz=a2->zreal-a1->zreal;
mrip1x=a3->xreal-a2->xreal;
mrip1y=a3->yreal-a2->yreal;
mrip1z=a3->zreal-a2->zreal;
tx=a1->xreal-a2->xreal;
ty=a1->yreal-a2->yreal;
tz=a1->zreal-a2->zreal;
l0=sqrt(tx*tx+ty*ty+tz*tz);
a=cos(g*l0);
b=sin(g*l0);
if((at+a2->n1)->typ == 0){
bx=(at+a2->n1)->xreal+delta-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
(at+a2->n1)->epx+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
bx=(at+a2->n1)->xreal-delta-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
(at+a2->n1)->emx+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
if((at+a2->n2)->typ == 0){
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal-delta;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
(at+a2->n2)->epx+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal+delta;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
(at+a2->n2)->emx+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
rix=a2->xreal-a1->xreal;
riy=a2->yreal-a1->yreal;
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal-a2->zreal;
mrix=a2->xreal-a1->xreal;
mriy=a2->yreal-a1->yreal;
mriz=a2->zreal-a1->zreal;
mrip1x=a3->xreal-a2->xreal;
mrip1y=a3->yreal-a2->yreal;
mrip1z=a3->zreal-a2->zreal;
if((at+a2->n1)->typ == 0){
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal+delta-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
(at+a2->n1)->epy+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-delta-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
(at+a2->n1)->emy+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
if((at+a2->n2)->typ == 0){
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal-delta;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
(at+a2->n2)->epy+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal+delta;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
(at+a2->n2)->emy+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
rix=a2->xreal-a1->xreal;
riy=a2->yreal-a1->yreal;
riz=a2->zreal-a1->zreal;
rip1x=a3->xreal-a2->xreal;
rip1y=a3->yreal-a2->yreal;
rip1z=a3->zreal-a2->zreal;
mrix=a2->xreal-a1->xreal;
mriy=a2->yreal-a1->yreal;
mriz=a2->zreal-a1->zreal;
mrip1x=a3->xreal-a2->xreal;
mrip1y=a3->yreal-a2->yreal;
mrip1z=a3->zreal-a2->zreal;
if((at+a2->n1)->typ == 0){
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal+delta-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
(at+a2->n1)->epz+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-delta-(at+a2->n2)->zreal;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
(at+a2->n1)->emz+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
if((at+a2->n2)->typ == 0){
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal-delta;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
rtx=rip1x-(u11(ux,uy,uz,a,b)*rix+u12(ux,uy,uz,a,b)*riy+u13(ux,uy,uz,a,b)*riz);
rty=rip1y-(u21(ux,uy,uz,a,b)*rix+u22(ux,uy,uz,a,b)*riy+u23(ux,uy,uz,a,b)*riz);
rtz=rip1z-(u31(ux,uy,uz,a,b)*rix+u32(ux,uy,uz,a,b)*riy+u33(ux,uy,uz,a,b)*riz);
(at+a2->n2)->epz+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
bx=(at+a2->n1)->xreal-(at+a2->n2)->xreal;
by=(at+a2->n1)->yreal-(at+a2->n2)->yreal;
bz=(at+a2->n1)->zreal-(at+a2->n2)->zreal+delta;
ux=crossx(tx,ty,tz,bx,by,bz);
uy=crossy(tx,ty,tz,bx,by,bz);
uz=crossz(tx,ty,tz,bx,by,bz);
inv_d=1./sqrt(ux*ux+uy*uy+uz*uz);
ux*=inv_d;
uy*=inv_d;
uz*=inv_d;
rtx=mrip1x-(u11(ux,uy,uz,a,b)*mrix+u12(ux,uy,uz,a,b)*mriy+u13(ux,uy,uz,a,b)*mriz);
rty=mrip1y-(u21(ux,uy,uz,a,b)*mrix+u22(ux,uy,uz,a,b)*mriy+u23(ux,uy,uz,a,b)*mriz);
rtz=mrip1z-(u31(ux,uy,uz,a,b)*mrix+u32(ux,uy,uz,a,b)*mriy+u33(ux,uy,uz,a,b)*mriz);
(at+a2->n2)->emz+=0.5*kbend*knew*(rtx*rtx+rty*rty+rtz*rtz);
}
}
a1=at+st;
tfx=tfy=tfz=Tx=Ty=Tz=0;
for(i=st;i<end;i++)
{
if(i==st)
{
a2=a1->helix[0];
a3=a2->helix[1];
}
else
{
a1=a2;
a2=a1->helix[1];
a3=a2->helix[1];
}
if((at+a2->n1)->typ == 0){
fx=-((at+a2->n1)->epx-(at+a2->n1)->emx)*0.5*inv_delta;
fy=-((at+a2->n1)->epy-(at+a2->n1)->emy)*0.5*inv_delta;
fz=-((at+a2->n1)->epz-(at+a2->n1)->emz)*0.5*inv_delta;
(at+a2->n1)->fx+=fx;
(at+a2->n1)->fy+=fy;
(at+a2->n1)->fz+=fz;
tfx+=fx;
tfy+=fy;
tfz+=fz;
ttx=crossx((at+a2->n1)->xreal,(at+a2->n1)->yreal,(at+a2->n1)->zreal,fx,fy,fz);
tty=crossy((at+a2->n1)->xreal,(at+a2->n1)->yreal,(at+a2->n1)->zreal,fx,fy,fz);
ttz=crossz((at+a2->n1)->xreal,(at+a2->n1)->yreal,(at+a2->n1)->zreal,fx,fy,fz);
Tx+=ttx;
Ty+=tty;
Tz+=ttz;
}
(at+a2->n1)->epx=(at+a2->n1)->emx=(at+a2->n1)->epy=(at+a2->n1)->emy=(at+a2->n1)->epz=(at+a2->n1)->emz=0;
if((at+a2->n2)->typ == 0){
fx=-((at+a2->n2)->epx-(at+a2->n2)->emx)*0.5*inv_delta;
fy=-((at+a2->n2)->epy-(at+a2->n2)->emy)*0.5*inv_delta;
fz=-((at+a2->n2)->epz-(at+a2->n2)->emz)*0.5*inv_delta;
(at+a2->n2)->fx+=fx;
(at+a2->n2)->fy+=fy;
(at+a2->n2)->fz+=fz;
tfx+=fx;
tfy+=fy;
tfz+=fz;
ttx=crossx((at+a2->n2)->xreal,(at+a2->n2)->yreal,(at+a2->n2)->zreal,fx,fy,fz);
tty=crossy((at+a2->n2)->xreal,(at+a2->n2)->yreal,(at+a2->n2)->zreal,fx,fy,fz);
ttz=crossz((at+a2->n2)->xreal,(at+a2->n2)->yreal,(at+a2->n2)->zreal,fx,fy,fz);
Tx+=ttx;
Ty+=tty;
Tz+=ttz;
}
(at+a2->n2)->epx=(at+a2->n2)->emx=(at+a2->n2)->epy=(at+a2->n2)->emy=(at+a2->n2)->epz=(at+a2->n2)->emz=0;
}
a2=at+st;
j=1;
for(i=st;i<end+2;i++)
{
a1=a2;
if(a1->typ == 0){
fx=-(a1->epx-a1->emx)*0.5*inv_delta;
fy=-(a1->epy-a1->emy)*0.5*inv_delta;
fz=-(a1->epz-a1->emz)*0.5*inv_delta;
a1->fx+=fx;
a1->fy+=fy;
a1->fz+=fz;
tfx+=fx;
tfy+=fy;
tfz+=fz;
ttx=crossx(a1->xreal,a1->yreal,a1->zreal,fx,fy,fz);
tty=crossy(a1->xreal,a1->yreal,a1->zreal,fx,fy,fz);
ttz=crossz(a1->xreal,a1->yreal,a1->zreal,fx,fy,fz);
Tx+=ttx;
Ty+=tty;
Tz+=ttz;
}
a1->epx=a1->emx=a1->epy=a1->emy=a1->epz=a1->emz=0;
if(i==st)
a2=a1->helix[0];
if(i>st && i<end+1)
a2=a1->helix[1];
}
}
void collisionAT(void)
{
unsigned long int i,n,j,ki=0,kj=0,Nsolpa,ic;
double xl,yl,zl,inv_j;
double vxs,vys,vzs,v2;
double u11,u12,u13,u21,u22,u23,u31,u32,u33,d,inv_d;
double shift1,shift2,shift3,tr,px,py,pz,rpc,rbp;
struct sol *srd;
struct aftr *a;
struct wallp *pwl;
struct redcell *rc;
static double *hux;
static double *hvx;
static double *hax;
static double *hbx;
static int n2t = 0;
if(n2t == 0){
hux = (double *) malloc(sizeof(double)*(600000));
if(hux == NULL){
printf("\n err_message(2)");
exit(1);
}
hvx = (double *) malloc(sizeof(double)*(600000));
if(hvx == NULL) exit(1);
hax = (double *) malloc(sizeof(double)*(600000));
if(hax == NULL) exit(1);
hbx = (double *) malloc(sizeof(double)*(600000));
if(hbx == NULL) exit(1);
n2t++;
}
hux[ki++] = 0.0;
hvx[0] = 0.0;
hvx[1] = 0.0;
hbx[0] = 0.0;
hbx[1] = 0.0;
hax[0] = 0.0;
Nsolpa = Nsolp;
wallpos();
for(i=0;i<Nsolp;i++)
{
srd=ss+i;
srd->pn=1000000000;
}
for(i=0;i<Naf;i++)
{
a=at+i;
a->pn=1000000000;
}
for(i=0;i<Nsolw;i++)
{
pwl=ww+i;
pwl->pn=1000000000;
}
for(i=0;i<Lr1*Lr1*L/numprocs;i++)
{
N_VCM[i].Vx=N_VCM[i].Vy=N_VCM[i].Vz=0;
N_VCM[i].Vnx=N_VCM[i].Vny=N_VCM[i].Vnz=0;
N_VCM[i].xcm=N_VCM[i].ycm=N_VCM[i].zcm=0;
N_VCM[i].xx=N_VCM[i].yy=N_VCM[i].zz=0;
N_monocell[i]=0;
N_VCM[i].S=1.;
N_VCM[i].r11=N_VCM[i].r12=N_VCM[i].r13=0;
N_VCM[i].r21=N_VCM[i].r22=N_VCM[i].r23=0;
N_VCM[i].r31=N_VCM[i].r32=N_VCM[i].r33=0;
N_VCM[i].crx=N_VCM[i].cry=N_VCM[i].crz=0;
}
if(rank==0){
shift2=(drand48()-0.5)*(double)cellsize;
shift3=(drand48()-0.5)*(double)cellsize;
shift1=(drand48()-0.5)*(double)cellsize;
}
if(numprocs > 1)
{
MPI_Bcast(&shift1,1,MPI_DOUBLE,0,comm1d);
MPI_Bcast(&shift2,1,MPI_DOUBLE,0,comm1d);
MPI_Bcast(&shift3,1,MPI_DOUBLE,0,comm1d);
}
//////////////////////////////
for(i=0;i<Nsolp;i++)
{
srd=ss+i;
xl=srd->x;
if(xl < -1000) continue;
if(xl < xsl) printf("\n rankkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk=%i i=%i xl=%e Nslop=%i \n",rank,i,xl,Nsolp);
if(xl >= xer) printf("\n rankkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk22222222222222=%i i=%i xl=%e Nsolp=%i \n",rank,i,xl,Nsolp);
xl=srd->x-shift1;
yl=srd->y-shift2;
zl=srd->z-shift3;
/* if(xl<0)
xl+=(double)L;
if(xl>=(double)L)
xl-=(double)L; */
/*
if(yl<0)
yl+=(double)Lr1;
if(yl>=(double)Lr1)
yl-=(double)Lr1;
if(zl<0)
zl+=(double)Lr1;
if(zl>=(double)Lr1)
zl-=(double)Lr1;
*/
if(yl<0 || yl>=(double)Lr1)
{
printf("\n err_message(300)");//////////
exit(1);
}
if(zl<0 || zl>=(double)Lr1)
{
printf("\n err_message(301)");/////////
exit(1);
}
srd->xa=xl;
srd->ya=yl;
srd->za=zl;
if(shift1 > 0)
{
if(xl < xsl)
{
hux[ki++]=(double)i;
hux[ki++]=xl;
hux[ki++]=yl;
hux[ki++]=zl;
hux[ki++]= srd->vx;
hux[ki++]= srd->vy;
hux[ki++]= srd->vz;
}
else if(xl >= xer)
{
printf("\n err_message(3)");
exit(1);
}
}
else if(shift1 <= 0)
{
if(xl >= xer)
{
hux[ki++]=(double)i;
hux[ki++]=xl;
hux[ki++]=yl;
hux[ki++]=zl;
hux[ki++]= srd->vx;
hux[ki++]= srd->vy;
hux[ki++]= srd->vz;
}
else if(xl < xsl)
{
printf("\n err_message(4)");///////
exit(1);
}
}
}
if(ki == 1) ki=0;
hux[0]=(double)ki;
if(numprocs > 1){
if(shift1 > 0)
MPI_Sendrecv(&hux[0],ki,MPI_DOUBLE,left,7,&hax[0],600000,MPI_DOUBLE,right,7,comm1d,&status);
else
MPI_Sendrecv(&hux[0],ki,MPI_DOUBLE,right,8,&hax[0],600000,MPI_DOUBLE,left,8,comm1d,&status);
// MPI_Sendrecv(&hvp[0],kj,MPI_DOUBLE,right,4,&hbp[0],600000,MPI_DOUBLE,left,4,comm1d,&status);
}
ki = (int)hax[0];
kj = 1;
while( kj < ki){
j = Nsolpa ;
Nsolpa++;
srd=ss+j;
srd->n=(int)hax[kj++];
srd->xa=hax[kj++];
if(shift1 > 0 && rank==numprocs-1) srd->xa+=(double)L;
if(shift1 < 0 && rank==0) srd->xa-=(double)L;
srd->ya=hax[kj++];
srd->za=hax[kj++];
srd->vx=hax[kj++];
srd->vy=hax[kj++];
srd->vz=hax[kj++];
}
for(i=0;i<Nsolpa;i++)
{
srd=ss+i;
xl=srd->x;
if(i<Nsolp && xl < -1000) continue;
xl=srd->xa;
if(xl < xsl || xl >= xer) continue;
yl=srd->ya;
zl=srd->za;
n=(unsigned long int)(floor(xl-xsl)+(double)(L/numprocs)*(floor(yl)+(double)Lr1*floor(zl)));
if(n > Lr1*Lr1*L/numprocs) printf("\n afrankkknnnnnnnnnnnnnpppppppppppppppppppp=%i n=%i xl=%e xsl=%i xer=%i \n",rank,n,xl,xsl,xer);
srd->pn=n;
N_monocell[n]+=1;
N_VCM[n].Vx+=srd->vx;
N_VCM[n].Vy+=srd->vy;
N_VCM[n].Vz+=srd->vz;
N_VCM[n].xcm+=srd->xa;
N_VCM[n].ycm+=srd->ya;
N_VCM[n].zcm+=srd->za;
}
tbf=0;
for(i=0;i<Naf;i++)
{
a=at+i;
if(a->typ ==2 )continue;
xl=a->xreal-shift1;
//xl=a->x;
if(xl < xsl || xl >= xer)continue;
yl=a->yreal-shift2;
zl=a->zreal-shift3;
a->vx+=vaddx;
a->vy+=vaddy;
a->vz+=vaddz;
tbf+=a->vx*a->vx+a->vy*a->vy+a->vz*a->vz;
/* if(xl<0)
xl+=(double)L;
if(xl>=(double)L)
xl-=(double)L; */
/* if(yl<0)
yl+=(double)Lr1;
if(yl>=(double)Lr1)
yl-=(double)Lr1;
if(zl<0)
zl+=(double)Lr1;
if(zl>=(double)Lr1)
zl-=(double)Lr1;
*/
if(yl<0 || yl>=(double)Lr1)
{
printf("\n err_message(302)");
exit(1);
}
if(zl<0 || zl>=(double)Lr1)
{
printf("\n err_message(303)");
exit(1);
}
n=(unsigned long int)(floor(xl-xsl)+(double)(L/numprocs)*(floor(yl)+(double)Lr1*floor(zl)));
if(n > Lr1*Lr1*L/numprocs) printf("\n afrankkknnnnnnnnnnnnnnnnnnnnnnnnnnnn=%i n=%i xl=%e xsl=%i xer=%i \n",rank,n,xl,xsl,xer);
a->pn=n;
N_monocell[n]+=1;
a->xa=xl;
a->ya=yl;
a->za=zl;
N_VCM[n].Vx+=a->vx;
N_VCM[n].Vy+=a->vy;
N_VCM[n].Vz+=a->vz;
N_VCM[n].xcm+=a->xa;
N_VCM[n].ycm+=a->ya;
N_VCM[n].zcm+=a->za;
}
tbf*=inv_Naf;
for(i=0;i<Nsolw;i++)
{
pwl=ww+i;
xl=pwl->x-shift1;;
yl=pwl->y-shift2;
zl=pwl->z-shift3;
pwl->xa=xl;
pwl->ya=yl;
pwl->za=zl;
if(yl<0 || yl>=(double)Lr1) continue;
if(zl<0 || zl>=(double)Lr1) continue;
if(xl < xsl || xl >= xer) continue;
n=(unsigned long int)(floor(xl-xsl)+(double)(L/numprocs)*(floor(yl)+(double)Lr1*floor(zl)));
if(n > Lr1*Lr1*L/numprocs) printf("\n afrankkknnnnnnnnnnnnnppppppppppppppppppppwwwall=%i n=%i xl=%e xsl=%i xer=%i \n",rank,n,xl,xsl,xer);
pwl->pn=n;
N_monocell[n]+=1;
N_VCM[n].Vx+=pwl->vx;
N_VCM[n].Vy+=pwl->vy;
N_VCM[n].Vz+=pwl->vz;
N_VCM[n].xcm+=pwl->xa;
N_VCM[n].ycm+=pwl->ya;
N_VCM[n].zcm+=pwl->za;
}
for(i=0;i<Lr1*Lr1*L/numprocs;i++)
{
j=N_monocell[i];
if(j>0)
{
inv_j=1./(double)j;
N_VCM[i].xcm*=inv_j;
N_VCM[i].ycm*=inv_j;
N_VCM[i].zcm*=inv_j;
N_VCM[i].Vx*=inv_j;
N_VCM[i].Vy*=inv_j;
N_VCM[i].Vz*=inv_j;
N_VCM[i].S=inv_j;
}
}
for(i=0;i<Nsolpa;i++)
{
srd=ss+i;
n=srd->pn;
if(n > 10000000)continue;
xl=srd->x;
if(i<Nsolp && xl < -1000)
{
printf("\n err_message(5)");
exit(1);
}
xl=srd->xa;
if(xl < xsl || xl >= xer)
{
printf("\n rankkknnnnnnnnnnnnnnnnnnnnnnnnnnnn=%i n=%i i=%i xl=%e xsl=%i xer=%i \n",rank,n,i,xl,xsl,xer);
printf("\n err_messagee(6)");
exit(1);
}
vxs=gaussianrandom();
vys=gaussianrandom();
vzs=gaussianrandom();
N_VCM[n].Vnx+=vxs*N_VCM[n].S;
N_VCM[n].Vny+=vys*N_VCM[n].S;
N_VCM[n].Vnz+=vzs*N_VCM[n].S;
xl=srd->xa-N_VCM[n].xcm;
yl=srd->ya-N_VCM[n].ycm;
zl=srd->za-N_VCM[n].zcm;
N_VCM[n].crx+=crossx(xl,yl,zl,(srd->vx-vxs),(srd->vy-vys),(srd->vz-vzs));
N_VCM[n].cry+=crossy(xl,yl,zl,(srd->vx-vxs),(srd->vy-vys),(srd->vz-vzs));
N_VCM[n].crz+=crossz(xl,yl,zl,(srd->vx-vxs),(srd->vy-vys),(srd->vz-vzs));
N_VCM[n].r11+=yl*yl+zl*zl;
N_VCM[n].r12-=xl*yl;
N_VCM[n].r13-=xl*zl;
N_VCM[n].r21-=xl*yl;
N_VCM[n].r22+=xl*xl+zl*zl;
N_VCM[n].r23-=yl*zl;
N_VCM[n].r31-=xl*zl;
N_VCM[n].r32-=yl*zl;
N_VCM[n].r33+=xl*xl+yl*yl;
srd->vx=vxs;
srd->vy=vys;
srd->vz=vzs;
}
for(i=0;i<Naf;i++)
{
a=at+i;
n=a->pn;
if(n > 10000000) continue;
//if(a->typ != 0 && a->typ != 1)continue;
//if( a->xa < xsl || a->xa >= xer)continue;
vxs=gaussianrandom();
vys=gaussianrandom();
vzs=gaussianrandom();
N_VCM[n].Vnx+=vxs*N_VCM[n].S;
N_VCM[n].Vny+=vys*N_VCM[n].S;
N_VCM[n].Vnz+=vzs*N_VCM[n].S;
xl=a->xa-N_VCM[n].xcm;
yl=a->ya-N_VCM[n].ycm;
zl=a->za-N_VCM[n].zcm;
N_VCM[n].crx+=crossx(xl,yl,zl,(a->vx-vxs),(a->vy-vys),(a->vz-vzs));
N_VCM[n].cry+=crossy(xl,yl,zl,(a->vx-vxs),(a->vy-vys),(a->vz-vzs));
N_VCM[n].crz+=crossz(xl,yl,zl,(a->vx-vxs),(a->vy-vys),(a->vz-vzs));
N_VCM[n].r11+=yl*yl+zl*zl;
N_VCM[n].r12-=xl*yl;
N_VCM[n].r13-=xl*zl;
N_VCM[n].r21-=xl*yl;
N_VCM[n].r22+=xl*xl+zl*zl;
N_VCM[n].r23-=yl*zl;
N_VCM[n].r31-=xl*zl;
N_VCM[n].r32-=yl*zl;
N_VCM[n].r33+=xl*xl+yl*yl;
a->vx=vxs;
a->vy=vys;
a->vz=vzs;
}
for(i=0;i<Nsolw;i++)
{
pwl=ww+i;
n=pwl->pn;
if(n > 10000000)continue;
vxs=gaussianrandom();
vys=gaussianrandom();
vzs=gaussianrandom();
N_VCM[n].Vnx+=vxs*N_VCM[n].S;
N_VCM[n].Vny+=vys*N_VCM[n].S;
N_VCM[n].Vnz+=vzs*N_VCM[n].S;
xl=pwl->xa-N_VCM[n].xcm;
yl=pwl->ya-N_VCM[n].ycm;
zl=pwl->za-N_VCM[n].zcm;
N_VCM[n].crx+=crossx(xl,yl,zl,(pwl->vx-vxs),(pwl->vy-vys),(pwl->vz-vzs));
N_VCM[n].cry+=crossy(xl,yl,zl,(pwl->vx-vxs),(pwl->vy-vys),(pwl->vz-vzs));
N_VCM[n].crz+=crossz(xl,yl,zl,(pwl->vx-vxs),(pwl->vy-vys),(pwl->vz-vzs));
N_VCM[n].r11+=yl*yl+zl*zl;
N_VCM[n].r12-=xl*yl;
N_VCM[n].r13-=xl*zl;
N_VCM[n].r21-=xl*yl;
N_VCM[n].r22+=xl*xl+zl*zl;
N_VCM[n].r23-=yl*zl;
N_VCM[n].r31-=xl*zl;
N_VCM[n].r32-=yl*zl;
N_VCM[n].r33+=xl*xl+yl*yl;
pwl->vrx=vxs;
pwl->vry=vys;
pwl->vrz=vzs;
}
for(n=0;n<Lr1*Lr1*L/numprocs;n++)
{
d=0;
d+=N_VCM[n].r11*(N_VCM[n].r22*N_VCM[n].r33-N_VCM[n].r23*N_VCM[n].r32);
d-=N_VCM[n].r12*(N_VCM[n].r21*N_VCM[n].r33-N_VCM[n].r23*N_VCM[n].r31);
d+=N_VCM[n].r13*(N_VCM[n].r21*N_VCM[n].r32-N_VCM[n].r22*N_VCM[n].r31);
if(d*d>1.e-6 && N_monocell[n]>2)
{
u11=(N_VCM[n].r22*N_VCM[n].r33)-(N_VCM[n].r23*N_VCM[n].r32);
u12=(N_VCM[n].r13*N_VCM[n].r32)-(N_VCM[n].r12*N_VCM[n].r33);
u13=(N_VCM[n].r12*N_VCM[n].r23)-(N_VCM[n].r13*N_VCM[n].r22);
u21=(N_VCM[n].r23*N_VCM[n].r31)-(N_VCM[n].r21*N_VCM[n].r33);
u22=(N_VCM[n].r11*N_VCM[n].r33)-(N_VCM[n].r13*N_VCM[n].r31);
u23=(N_VCM[n].r13*N_VCM[n].r21)-(N_VCM[n].r11*N_VCM[n].r23);
u31=(N_VCM[n].r21*N_VCM[n].r32)-(N_VCM[n].r22*N_VCM[n].r31);
u32=(N_VCM[n].r12*N_VCM[n].r31)-(N_VCM[n].r11*N_VCM[n].r32);
u33=(N_VCM[n].r11*N_VCM[n].r22)-(N_VCM[n].r12*N_VCM[n].r21);
inv_d=1./d;
N_VCM[n].r11=u11*inv_d;
N_VCM[n].r12=u12*inv_d;
N_VCM[n].r13=u13*inv_d;
N_VCM[n].r21=u21*inv_d;
N_VCM[n].r22=u22*inv_d;
N_VCM[n].r23=u23*inv_d;
N_VCM[n].r31=u31*inv_d;
N_VCM[n].r32=u32*inv_d;
N_VCM[n].r33=u33*inv_d;
}
else
{
d=(N_VCM[n].r11+N_VCM[n].r22+N_VCM[n].r33)*(N_VCM[n].r11+N_VCM[n].r22+N_VCM[n].r33);
if(d*d>1.e-6 && N_monocell[n]==2)
{
tr=4./d;
N_VCM[n].r11*=tr;
N_VCM[n].r12*=tr;
N_VCM[n].r13*=tr;
N_VCM[n].r21*=tr;
N_VCM[n].r22*=tr;
N_VCM[n].r23*=tr;
N_VCM[n].r31*=tr;
N_VCM[n].r32*=tr;
N_VCM[n].r33*=tr;
}
else
{
N_VCM[n].r11=0;
N_VCM[n].r12=0;
N_VCM[n].r13=0;
N_VCM[n].r21=0;
N_VCM[n].r22=0;
N_VCM[n].r23=0;
N_VCM[n].r31=0;
N_VCM[n].r32=0;
N_VCM[n].r33=0;
}
}
N_VCM[n].xx=N_VCM[n].r11*N_VCM[n].crx+N_VCM[n].r12*N_VCM[n].cry+N_VCM[n].r13*N_VCM[n].crz;
N_VCM[n].yy=N_VCM[n].r21*N_VCM[n].crx+N_VCM[n].r22*N_VCM[n].cry+N_VCM[n].r23*N_VCM[n].crz;
N_VCM[n].zz=N_VCM[n].r31*N_VCM[n].crx+N_VCM[n].r32*N_VCM[n].cry+N_VCM[n].r33*N_VCM[n].crz;
}
if(OBSM==1)
{
for(i=0;i<Nsolw;i++)
{
pwl=ww+i;
n=pwl->pn;
if(n > 10000000)continue;
rbp=sqrt((ylc-pwl->y)*(ylc-pwl->y)+(zlc-pwl->z)*(zlc-pwl->z));
if(rbp >= Lr0)continue;
xl=pwl->xa-N_VCM[n].xcm;
yl=pwl->ya-N_VCM[n].ycm;
zl=pwl->za-N_VCM[n].zcm;
px=N_VCM[n].xx;
py=N_VCM[n].yy;
pz=N_VCM[n].zz;
vxs=crossx(px,py,pz,xl,yl,zl);
vys=crossy(px,py,pz,xl,yl,zl);
vzs=crossz(px,py,pz,xl,yl,zl);
pwl->vrx+=N_VCM[n].Vx-N_VCM[n].Vnx+vxs;
pwl->vry+=N_VCM[n].Vy-N_VCM[n].Vny+vys;
pwl->vrz+=N_VCM[n].Vz-N_VCM[n].Vnz+vzs;
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
xl=pwl->x;
yl=pwl->y;
zl=pwl->z;
rpc=sqrt((xl-rc->xcm)*(xl-rc->xcm)+(yl-rc->ycm)*(yl-rc->ycm)+(zl-rc->zcm)*(zl-rc->zcm));
if(rpc<Rrbc)
{
rc->Momx+= pwl->vrx-pwl->vx;
rc->Momy+= pwl->vry-pwl->vy;
rc->Momz+= pwl->vrz-pwl->vz;
rc->Amomx+=crossx((xl-rc->xcm),(yl-rc->ycm),(zl-rc->zcm),(pwl->vrx-pwl->vx),(pwl->vry-pwl->vy),(pwl->vrz-pwl->vz));
rc->Amomy+=crossy((xl-rc->xcm),(yl-rc->ycm),(zl-rc->zcm),(pwl->vrx-pwl->vx),(pwl->vry-pwl->vy),(pwl->vrz-pwl->vz));
rc->Amomz+=crossz((xl-rc->xcm),(yl-rc->ycm),(zl-rc->zcm),(pwl->vrx-pwl->vx),(pwl->vry-pwl->vy),(pwl->vrz-pwl->vz));
ic=Nrbcp+10;
}
}
}
ki=0;
kj=0;
hux[ki++] = 0.0;
hvx[kj++] = 0.0;
hax[0] = 0.0;
hbx[0] = 0.0;
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip != 1)continue;
if(rc->xcm <= xsl+Rrbc+0.55)
{
hux[ki++]=(double)rc->id;
hux[ki++]=rc->Momx;
hux[ki++]=rc->Momy;
hux[ki++]=rc->Momz;
hux[ki++]=rc->Amomx;
hux[ki++]=rc->Amomy;
hux[ki++]=rc->Amomz;
}
else if(rc->xcm >= xer-Rrbc-0.55)
{
hvx[kj++]=(double)rc->id;
hvx[kj++]=rc->Momx;
hvx[kj++]=rc->Momy;
hvx[kj++]=rc->Momz;
hvx[kj++]=rc->Amomx;
hvx[kj++]=rc->Amomy;
hvx[kj++]=rc->Amomz;
}
}
if(ki == 1) ki=0;
if(kj == 1) kj=0;
hux[0]=(double)ki;
hvx[0]=(double)kj;
if(numprocs > 1){
MPI_Sendrecv(&hux[0],ki,MPI_DOUBLE,left,195,&hax[0],5000,MPI_DOUBLE,right,195,comm1d,&status);
MPI_Sendrecv(&hvx[0],kj,MPI_DOUBLE,right,196,&hbx[0],5000,MPI_DOUBLE,left,196,comm1d,&status);
}
///*****************************************//
ki = (int)hax[0];
kj = 1;
while( kj < ki){
i=(int)hax[kj++];
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip != 1)continue;
if(rc->id == i)
{
rc->Momx+=hax[kj++];
rc->Momy+=hax[kj++];
rc->Momz+=hax[kj++];
rc->Amomx+=hax[kj++];
rc->Amomy+=hax[kj++];
rc->Amomz+=hax[kj++];
ic=Nrbcp+10;
}
}
if(ic < Nrbcp+3)
{
printf("collERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_ip");
printf(" rank=%i id=%i xsl=%i xer=%i \n",rank,i,xsl,xer);
exit(1);
}
}
ki = (int)hbx[0];
kj = 1;
while( kj < ki){
i=(int)hbx[kj++];
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip != 1)continue;
if(rc->id == i)
{
rc->Momx+=hbx[kj++];
rc->Momy+=hbx[kj++];
rc->Momz+=hbx[kj++];
rc->Amomx+=hbx[kj++];
rc->Amomy+=hbx[kj++];
rc->Amomz+=hbx[kj++];
ic=Nrbcp+10;
}
}
if(ic < Nrbcp+3)
{
printf("collERRRRRRRRRRROOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR_ipbb");
printf(" rank=%i id=%i xsl=%i xer=%i \n",rank,i,xsl,xer);
exit(1);
}
}
for(ic=0;ic<Nrbcp;ic++)
{
rc=rbc+ic;
if(rc->ip == 2)continue;
rc->Vxcm+=(rc->Momx/Mrbc);
rc->Vycm+=(rc->Momy/Mrbc);
rc->Vzcm+=(rc->Momz/Mrbc);
rc->wx+=(rc->Amomx/Irbc);
rc->wy+=(rc->Amomy/Irbc);
rc->wz+=(rc->Amomz/Irbc);
rc->ex+=(crossx(rc->wx,rc->wy,rc->wz,rc->ex,rc->ey,rc->ez))*dt;
rc->ey+=(crossy(rc->wx,rc->wy,rc->wz,rc->ex,rc->ey,rc->ez))*dt;
rc->ez+=(crossz(rc->wx,rc->wy,rc->wz,rc->ex,rc->ey,rc->ez))*dt;
rc->ex=rc->ex/sqrt(rc->ex*rc->ex+rc->ey*rc->ey+rc->ez*rc->ez);
rc->ey=rc->ey/sqrt(rc->ex*rc->ex+rc->ey*rc->ey+rc->ez*rc->ez);
rc->ez=rc->ez/sqrt(rc->ex*rc->ex+rc->ey*rc->ey+rc->ez*rc->ez);
rc->Momx=0.0;
rc->Momy=0.0;
rc->Momz=0.0;
rc->Amomx=0.0;
rc->Amomy=0.0;
rc->Amomz=0.0;
}
}
ki=2;
hvx[0] = 0.0;
hvx[1] = 0.0;
hbx[0] = 0.0;
hbx[1] = 0.0;
for(i=0;i<Nsolpa;i++)
{
srd=ss+i;
n=srd->pn;
if(n > 10000000) continue;
xl=srd->xa-N_VCM[n].xcm;
yl=srd->ya-N_VCM[n].ycm;
zl=srd->za-N_VCM[n].zcm;
px=N_VCM[n].xx;
py=N_VCM[n].yy;
pz=N_VCM[n].zz;
vxs=crossx(px,py,pz,xl,yl,zl);
vys=crossy(px,py,pz,xl,yl,zl);
vzs=crossz(px,py,pz,xl,yl,zl);
srd->vx+=N_VCM[n].Vx-N_VCM[n].Vnx+vxs;
srd->vy+=N_VCM[n].Vy-N_VCM[n].Vny+vys;
srd->vz+=N_VCM[n].Vz-N_VCM[n].Vnz+vzs;
if(i >= Nsolp)
{
hvx[ki++]=(double)srd->n;
hvx[ki++]= srd->vx;
hvx[ki++]= srd->vy;
hvx[ki++]= srd->vz;
}
}
hvx[1]=(double)ki;
v2=0;
for(i=0;i<Naf;i++)
{
a=at+i;
n=a->pn;
if(n > 10000000) continue;
xl=a->xa-N_VCM[n].xcm;
yl=a->ya-N_VCM[n].ycm;
zl=a->za-N_VCM[n].zcm;
px=N_VCM[n].xx;
py=N_VCM[n].yy;
pz=N_VCM[n].zz;
vxs=crossx(px,py,pz,xl,yl,zl);
vys=crossy(px,py,pz,xl,yl,zl);
vzs=crossz(px,py,pz,xl,yl,zl);
a->vx+=N_VCM[n].Vx-N_VCM[n].Vnx+vxs;
a->vy+=N_VCM[n].Vy-N_VCM[n].Vny+vys;
a->vz+=N_VCM[n].Vz-N_VCM[n].Vnz+vzs;
v2+=a->vx*a->vx+a->vy*a->vy+a->vz*a->vz;
if(a->typ != 0)
{
if(a->xreal >= xsl && a->xreal < xer)
{
printf("\n rankkknnnnnn=%i n=%i typ=%i xl=%e xsl=%i xer=%i \n",rank,n,a->typ,a->xreal,xsl,xer);
printf("\n err_message(7)");
exit(1);
}
hvx[ki++]=(double)i;
hvx[ki++]= a->vx;
hvx[ki++]= a->vy;
hvx[ki++]= a->vz;
}
}
if(ki == 2) ki=0;
hvx[0]=(double)ki;
taf+=0.5*(tbf-v2*inv_Naf);
if(numprocs > 1){
if(shift1 > 0)
MPI_Sendrecv(&hvx[0],ki,MPI_DOUBLE,right,9,&hbx[0],600000,MPI_DOUBLE,left,9,comm1d,&status);
else
MPI_Sendrecv(&hvx[0],ki,MPI_DOUBLE,left,10,&hbx[0],600000,MPI_DOUBLE,right,10,comm1d,&status);
}
ki = (int)hbx[0];
j = (int)hbx[1];
kj = 2;
while( kj < ki){
if( kj < j){
i=(int)hbx[kj++];
srd=ss+i;
srd->vx=hbx[kj++];
srd->vy=hbx[kj++];
srd->vz=hbx[kj++];
}
else{
i=(int)hbx[kj++];
a=at+i;
a->vx=hbx[kj++];
a->vy=hbx[kj++];
a->vz=hbx[kj++];
}
}
}
void results()
{
unsigned long int i;
double xcm,ycm,zcm,r2,v2,pe,tfx,tfy,tfz,tfnor1,tfnor2,tfper,ttx,tty,ttz,tvx,tvy,tvz;
double tvnor1,tvnor2,tvper,tax,tay,taz,inv_d;
struct aftr *a;
struct sol *srd;
xcm=ycm=zcm=r2=v2=pe=tfx=tfy=tfz=tfnor1=tfnor2=tfper=tvnor1=tvnor2=tvper=ttx=tty=ttz=tvx=tvy=tvz=0;
tax=tay=taz=0;
for(i=0;i<Naf;i++)
{
a=at+i;
r2+=dist2(a->x0,a->xreal,a->y0,a->yreal,a->z0,a->zreal);
v2+=a->vx*a->vx+a->vy*a->vy+a->vz*a->vz;
pe+=a->PE;
tfx+=a->ax;
tfy+=a->ay;
tfz+=a->az;
tvx+=a->vx;
tvy+=a->vy;
tvz+=a->vz;
ttx+=crossx(a->xreal,a->yreal,a->zreal,a->ax,a->ay,a->az);
tty+=crossy(a->xreal,a->yreal,a->zreal,a->ax,a->ay,a->az);
ttz+=crossz(a->xreal,a->yreal,a->zreal,a->ax,a->ay,a->az);
inv_d=1./(a->xreal*a->xreal+a->yreal*a->yreal+a->zreal*a->zreal);
tax+=crossx(a->xreal,a->yreal,a->zreal,a->vx,a->vy,a->vz)*inv_d;
tay+=crossy(a->xreal,a->yreal,a->zreal,a->vx,a->vy,a->vz)*inv_d;
taz+=crossz(a->xreal,a->yreal,a->zreal,a->vx,a->vy,a->vz)*inv_d;
tfnor1+=(a->ax*a->nx+a->ay*a->ny+a->az*a->nz);
tfnor2+=(a->ax*a->tx+a->ay*a->ty+a->az*a->tz);
tfper+=(a->ax*(cnt+a->plane)->dirx+a->ay*(cnt+a->plane)->diry+a->az*(cnt+a->plane)->dirz);
tvnor1+=(a->vx*a->nx+a->vy*a->ny+a->vz*a->nz);
tvnor2+=(a->vx*a->tx+a->vy*a->ty+a->vz*a->tz);
tvper+=(a->vx*(cnt+a->plane)->dirx+a->vy*(cnt+a->plane)->diry+a->vz*(cnt+a->plane)->dirz);
a->PE=0;
}
//printf("Nsol=%le\n",v2/(double)(Nsol+Naf));
R2+=r2*inv_Naf;
R2CM+=dist2((cm+0)->xc0,(cm+0)->xreal,(cm+0)->yc0,(cm+0)->yreal,(cm+0)->zc0,(cm+0)->zreal);
KE+=0.5*v2*inv_Naf;
PE+=pe*inv_Naf;
totforx+=tfx*inv_Naf;
totfory+=tfy*inv_Naf;
totforz+=tfz*inv_Naf;
tottorx+=ttx*inv_Naf;
tottory+=tty*inv_Naf;
tottorz+=ttz*inv_Naf;
totangx+=tax*inv_Naf;
totangy+=tay*inv_Naf;
totangz+=taz*inv_Naf;
TNF1+=tfnor1*inv_Naf;
TNF2+=tfnor2*inv_Naf;
TPF+=tfper*inv_Naf;
TNV1+=tvnor1*inv_Naf;
TNV2+=tvnor2*inv_Naf;
TPV+=tvper*inv_Naf;
totvx+=tvx*inv_Naf;
totvy+=tvy*inv_Naf;
totvz+=tvz*inv_Naf;
//tvx=tvy=tvz=0;
for(i=0;i<Nsol;i++)
{
srd=ss+i;
v2+=srd->vx*srd->vx+srd->vy*srd->vy+srd->vz*srd->vz;
}
vsol2+=v2/(double)(Nsol+Naf);
}
void average()
{
double Nav,cp,cp1,e2edis,cp2,invcol;
Nav=1./(double)classwidth;
invcol=1./((double)classwidth*dtaf/dt);
//printf("sol=%le\n",vsol2/3.);
e2edis=sqrt(dist2((at+0)->xreal,(at+length-1)->xreal,(at+0)->yreal,(at+length-1)->yreal,(at+0)->zreal,(at+length-1)->zreal));
fp=fopen("diffusion.dat","a");
fprintf(fp,"%le\t%le\t%le\t",totdt,R2*Nav,R2CM*Nav);
fprintf(fp,"%le\t%le\t%le\t%le\t%le\n",KE*Nav,PE*Nav,(PE+KE)*Nav,vsol2*0.33333*Nav,e2edis*inv_tlength);
fclose(fp);
cp=(at+0)->nx*(at+0)->nx0+(at+0)->ny*(at+0)->ny0+(at+0)->nz*(at+0)->nz0;
cp1=(at+(Naf-1))->nx*(at+(Naf-1))->nx0+(at+(Naf-1))->ny*(at+(Naf-1))->ny0+(at+(Naf-1))->nz*(at+(Naf-1))->nz0;
cp2=(at+(Naf-1))->nx*(at+0)->nx+(at+(Naf-1))->ny*(at+0)->ny+(at+(Naf-1))->nz*(at+0)->nz;
fp=fopen("for-vel.dat","a");
fprintf(fp,"%le\t%le\t%le\t",totdt,totforx*Nav,totfory*Nav);
fprintf(fp,"%le\t%le\t%le\t%le\t",totforz*Nav,totvx*Nav,totvy*Nav,totvz*Nav);
fprintf(fp,"%le\t%le\t%le\t%le\t%le\t%le\n",tottorx*Nav,tottory*Nav,tottorz*Nav,totangx*Nav,totangy*Nav,totangz*Nav);
fclose(fp);
fp=fopen("angle.dat","a");
fprintf(fp,"%le\t%le\t%le\t%le\n",totdt,cp,cp1,cp2);
fclose(fp);
fp=fopen("fvpp.dat","a");
fprintf(fp,"%le\t%le\t%le\t%le\t%le\t%le\t%le\t%le\n",totdt,TNF1*Nav,TNF2*Nav,TPF*Nav,TNV1*Nav,TNV2*Nav,TPV*Nav,taf*invcol);
fclose(fp);
R2=R2CM=KE=PE=totforx=totfory=totforz=totvx=totvy=totvz=vsol2=TNF1=TNF2=TPF=TNV1=TNV2=TPV=tottorx=tottory=tottorz=taf=0;
totangx=totangy=totangz=0;
}
void transverse()
{
unsigned long int i,out,k,j,tl,out1;
double dam1x,dam1y,dam1z,d2,d,inv_d,fx,fy,fz,D,kh,strans;
double nx,ny,nz,ux,uy,uz,tx,ty,tz,ct,ct1,g;
struct aftr *ram2,*ram1;
i=out=0;
for(k=0;k<npoints;k++)
{
ram2=(at+(length*k));
j=out1=0;
tl=length-1;
do
{
if(j==0)
ram1=ram2->flagella[0];
else
ram1=ram2->flagella[1];/*a-1*/
nx=ram2->nx;
ny=ram2->ny;
nz=ram2->nz;
dam1x=(cnt+ram2->plane)->dirx;
dam1y=(cnt+ram2->plane)->diry;
dam1z=(cnt+ram2->plane)->dirz;
tx=crossx(nx,ny,nz,dam1x,dam1y,dam1z);
ty=crossy(nx,ny,nz,dam1x,dam1y,dam1z);
tz=crossz(nx,ny,nz,dam1x,dam1y,dam1z);
//inv_d=0;
d2=tx*tx+ty*ty+tz*tz;
d=sqrt(d2);
inv_d=1./d;
tx*=inv_d;
ty*=inv_d;
tz*=inv_d;
ram2->tx=tx;
ram2->ty=ty;
ram2->tz=tz;
//printf("trans1 %ld\t%ld\t%ld\n",ram2->n,ram1->n,j);
if(j==tl-1)
{
ram1->tx=tx;
ram1->ty=ty;
ram1->tz=tz;
//printf("trans11111 %ld\t%ld\t%ld\n",ram2->n,ram1->n,j);
}
//printf("bending body %ld\t%ld\t%ld\t%ld\t%ld\t\t%ld\t%le\n",ram2->n,ram1->n,ra->n,rap1->n,rap2->n,j,ra->cangle);
ram2=ram1;/*a-1*/
j++;
//ra->fz+=10.*sin(2.*PI*sqrt(caa));
if(ram1==(at+(k*length+tl)))/*(cm+0)->mtube[k])*/
out1=1;
}
while(out1==0);
}
}
void flalink(struct aftr *a,struct aftr *b)
{
unsigned long int i;
i=0;
while (a->flagella[i] && i<2)
i++;
if (i<2)
a->flagella[i]=b;
else
{
printf("MORE THAN 2 NEIGHB in flalink. !!! %ld\t%ld\n",a->flagella[0]->n,a->flagella[1]->n);
exit(1);
}
}
void hellink(struct aftr *a,struct aftr *b)
{
unsigned long int i;
i=0;
while (a->helix[i] && i<2)
i++;
if (i<2)
a->helix[i]=b;
else
{
printf("MORE THAN 2 NEIGHB in hellink. !!! %ld\t%ld\t%ld\n",a->n,a->helix[0]->n,a->helix[1]->n);
exit(1);
}
}
void velupdate(double nx,double ny,double nz,double tx1,double ty1,double tz1, unsigned long int afp, unsigned long int mn)
{
unsigned long int i,n;
double nr,tg,bi,vx,vy,vz,tx2,ty2,tz2,inv_d;
struct sol *srd;
srd=ss+mn;
nr=rayleighrandom();
tg=gaussianrandom();
bi=gaussianrandom();
tx2=crossx(nx,ny,nz,tx1,ty1,tz1);
ty2=crossy(nx,ny,nz,tx1,ty1,tz1);
tz2=crossz(nx,ny,nz,tx1,ty1,tz1);
inv_d=1./sqrt(tx2*tx2+ty2*ty2+tz2*tz2);
tx2*=inv_d;
ty2*=inv_d;
tz2*=inv_d;
vx=nx*nr+tx1*tg+tx2*bi;
vy=ny*nr+ty1*tg+ty2*bi;
vz=nz*nr+tz1*tg+tz2*bi;
vaddx+=(srd->vx-vx);
vaddy+=(srd->vy-vy);
vaddz+=(srd->vz-vz);
srd->vx=vx;
srd->vy=vy;
srd->vz=vz;
srd->in=1;
}
void velupdate2(unsigned long int afp, unsigned long int mn)
{
double vx,vy,vz;
struct aftr *a,*a1;
struct sol *srd;
srd=ss+mn;
a=at+afp;
vx=a->vx;
vy=a->vy;
vz=a->vz;
vaddx+=(srd->vx-vx);
vaddy+=(srd->vy-vy);
vaddz+=(srd->vz-vz);
/* a->vx+=(srd->vx-vx);
a->vy+=(srd->vy-vy);
a->vz+=(srd->vz-vz);
*/
srd->vx=vx;
srd->vy=vy;
srd->vz=vz;
srd->in=1;
}
double rayleighrandom()
{
return(SRTEMP*sqrt(-2.*log(1.-drand48())));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment