X-Git-Url: https://hackdaworld.org/gitweb/?p=physik%2Fposic.git;a=blobdiff_plain;f=mdrun.c;fp=mdrun.c;h=3266dd3804a0ac0668049988c30ecfac554a8fca;hp=130725d48fc70c74fcaf47146e963ff578928b15;hb=ff44bcba9df0d021568abcb553d1d490c442f696;hpb=98c1ca4feaacee4f319a6c288aa2b0cef65033e4 diff --git a/mdrun.c b/mdrun.c index 130725d..3266dd3 100644 --- a/mdrun.c +++ b/mdrun.c @@ -129,8 +129,8 @@ int add_stage(t_mdrun *mdrun,u8 type,void *params) { 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); @@ -1221,12 +1221,10 @@ int crt(t_moldyn *moldyn,t_mdrun *mdrun) { 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; @@ -1236,7 +1234,7 @@ int crt(t_moldyn *moldyn,t_mdrun *mdrun) { /* 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) { @@ -1247,8 +1245,10 @@ int crt(t_moldyn *moldyn,t_mdrun *mdrun) { 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 @@ -1271,18 +1271,18 @@ int crt(t_moldyn *moldyn,t_mdrun *mdrun) { 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; } @@ -1293,17 +1293,25 @@ int crt(t_moldyn *moldyn,t_mdrun *mdrun) { return -1; } // set crt mode - crt=crtp->type; + crtt=crtp->type; } /* crt routines: calculate displacement + set individual constraints */ + printf(" crt step %d of %d in total\n\n",crtp->count+1,crtp->steps); + for(i=0;icount;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 + 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; @@ -1329,6 +1337,7 @@ int mdrun_hook(void *ptr1,void *ptr2) { t_set_temp_params *stp; t_set_timestep_params *stsp; t_fill_params *fp; + t_crt_params *crtp; moldyn=ptr1; mdrun=ptr2; @@ -1499,10 +1508,13 @@ int mdrun_hook(void *ptr1,void *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; } @@ -1552,6 +1564,11 @@ int main(int argc,char **argv) { 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;