case STAGE_THERMAL_INIT:
psize=0;
break;
- case STAGE_CONSTRAINT_RELAXATION_TECHNIQUE:
- psize=sizeof(t_constraint_relaxation_technique);
+ case STAGE_CRT:
+ psize=sizeof(t_crt_params);
break;
default:
printf("%s unknown stage type: %02x\n",ME,type);
t_del_atoms_params *delp;
int i;
t_3dvec dist;
-
+ u8 outer;
+
+ outer=0;
stage=mdrun->stage.current->data;
delp=stage->params;
+ if(delp->r<0)
+ outer=1;
+
for(i=0;i<moldyn->count;i++) {
v3_sub(&dist,&(delp->o),&(moldyn->atom[i].r));
//printf("%d ----> %f %f %f = %f | %f\n",i,dist.x,dist.y,dist.z,v3_absolute_square(&dist),delp->r*delp->r);
if(v3_absolute_square(&dist)<=(delp->r*delp->r)) {
- del_atom(moldyn,moldyn->atom[i].tag);
- printf("%s atom deleted: %d %d %d\n",ME,
- moldyn->atom[i].tag,moldyn->atom[i].element,
- moldyn->atom[i].brand);
+ if(!outer) {
+ del_atom(moldyn,moldyn->atom[i].tag);
+ printf("%s atom deleted: %d %d %d\n",ME,
+ moldyn->atom[i].tag,
+ moldyn->atom[i].element,
+ moldyn->atom[i].brand);
+ }
+ }
+ else {
+ if(outer) {
+ del_atom(moldyn,moldyn->atom[i].tag);
+ printf("%s atom deleted: %d %d %d\n",ME,
+ moldyn->atom[i].tag,
+ moldyn->atom[i].element,
+ moldyn->atom[i].brand);
+ }
}
}
int ret;
void *ptr;
- extern u8 crt;
- extern u8 *constraints;
- extern double *trafo_angles;
-
t_atom *atom;
- double dx,dy,dz;
+ t_3dvec disp;
+ double frac;
+ int i;
stage=mdrun->stage.current->data;
crtp=stage->params;
/* initial stuff */
if(crtp->count==0) {
- printf(" crt init\n",acount);
+ printf(" crt init\n");
// read final positions, constraints and do the alloc
fd=open(crtp->file,O_RDONLY);
if(fd<0) {
ret=get_line(fd,line,128);
// check for end of file
if(ret<=0) {
- printf(" -> read %d atom positions\n",acount);
- crtp->acnt=acount;
+ printf(" read %d atom positions\n",acount);
+ if(acount!=moldyn->count)
+ printf(" atom count mismatch!!!\n");
+ printf("\n");
break;
}
// ignore # lines and \n
wptr=strtok(line," \t");
// read x y z
wptr=strtok(NULL," \t");
- crtp->r_fin.x=atof(wptr);
+ crtp->r_fin[acount].x=atof(wptr);
wptr=strtok(NULL," \t");
- crtp->r_fin.y=atof(wptr);
+ crtp->r_fin[acount].y=atof(wptr);
wptr=strtok(NULL," \t");
- crtp->r_fin.z=atof(wptr);
+ crtp->r_fin[acount].z=atof(wptr);
// read constraints
wptr=strtok(NULL," \t");
- constraints[acount]=atoi(wptr);
+ constraints[3*acount]=atoi(wptr);
wptr=strtok(NULL," \t");
- constraints[acount+1]=atoi(wptr);
+ constraints[3*acount+1]=atoi(wptr);
wptr=strtok(NULL," \t");
- constraints[acount+2]=atoi(wptr);
+ constraints[3*acount+2]=atoi(wptr);
// done reading
acount+=1;
}
+ close(fd);
// allocate trafo angles
trafo_angle=malloc(acount*2*sizeof(double));
if(trafo_angle==NULL) {
return -1;
}
// set crt mode
- crt=crtp->type;
+ crtt=crtp->type;
}
+ /* write a save file s-crt_xofy.save */
+ snprintf(line,128,"%s/s-crt_%03dof%03d.save",
+ moldyn->vlsdir,crtp->count,crtp->steps);
+ fd=open(line,O_WRONLY|O_TRUNC|O_CREAT,S_IRUSR|S_IWUSR);
+ if(fd<0) perror("[mdrun] crt save fd open");
+ else {
+ write(fd,moldyn,sizeof(t_moldyn));
+ write(fd,moldyn->atom,
+ moldyn->count*sizeof(t_atom));
+ }
+ close(fd);
+ /* visualize atoms */
+ visual_atoms(moldyn);
+
+ /* output energy */
+ printf(" crt energy: %d - %f\n\n",
+ crtp->count,(moldyn->ekin+moldyn->energy)/EV);
+
/* crt routines: calculate displacement + set individual constraints */
+ printf(" crt step %d of %d in total\n\n",crtp->count+1,crtp->steps);
+
+ if((crtp->type==1)|(crtp->count==0))
+ printf(" crt angle update\n\n");
+
for(i=0;i<moldyn->count;i++) {
+ // calc displacements
atom=moldyn->atom;
- dx=atom[i].r.x-crtp->r_fin[i].x;
- dy=atom[i].r.y-crtp->r_fin[i].y;
- dz=atom[i].r.z-crtp->r_fin[i].z;
- // HIER WEITER
+ v3_sub(&disp,&(crtp->r_fin[i]),&(atom[i].r));
+ // angles
+ if((crtp->type==1)|(crtp->count==0)) {
+ trafo_angle[2*i]=atan2(disp.x,disp.y);
+ trafo_angle[2*i+1]=-atan2(disp.z,
+ sqrt(disp.x*disp.x+disp.y*disp.y));
+ }
+ // move atoms
+ frac=1.0/(crtp->steps-crtp->count);
+ v3_scale(&disp,&disp,frac);
+ v3_add(&(atom[i].r),&(atom[i].r),&disp);
}
return 0;
t_set_temp_params *stp;
t_set_timestep_params *stsp;
t_fill_params *fp;
+ t_crt_params *crtp;
moldyn=ptr1;
mdrun=ptr2;
change_stage=TRUE;
break;
case STAGE_CRT:
- stage_print(" -> constraint relaxation")
+ stage_print(" -> constraint relaxation");
stage_print(" technique\n\n");
crtp=stage->params;
if(crtp->count==crtp->steps) {
+ free(constraints);
+ free(trafo_angle);
+ free(crtp->r_fin);
change_stage=TRUE;
break;
}
memset(&mdrun,0,sizeof(t_mdrun));
memset(&moldyn,0,sizeof(t_moldyn));
+ /* init crt variables */
+ crtt=0;
+ constraints=NULL;
+ trafo_angle=NULL;
+
/* parse arguments */
if(mdrun_parse_argv(&mdrun,argc,argv)<0)
return -1;