X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=mdrun.c;h=130725d48fc70c74fcaf47146e963ff578928b15;hb=98c1ca4feaacee4f319a6c288aa2b0cef65033e4;hp=31e5f0a162a9d0d296e4959037bc6a92b3545b52;hpb=beac6be36b6859ff09d1d5c426b762a9fb34c03d;p=physik%2Fposic.git diff --git a/mdrun.c b/mdrun.c index 31e5f0a..130725d 100644 --- a/mdrun.c +++ b/mdrun.c @@ -129,6 +129,9 @@ 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); + break; default: printf("%s unknown stage type: %02x\n",ME,type); return -1; @@ -178,6 +181,7 @@ int mdrun_parse_config(t_mdrun *mdrun) { t_set_timestep_params stsp; t_fill_params fp; t_del_atoms_params delp; + t_crt_params crtp; /* open config file */ fd=open(mdrun->cfile,O_RDONLY); @@ -212,6 +216,7 @@ int mdrun_parse_config(t_mdrun *mdrun) { memset(&stsp,0,sizeof(t_set_timestep_params)); memset(&fp,0,sizeof(t_fill_params)); memset(&delp,0,sizeof(t_del_atoms_params)); + memset(&crtp,0,sizeof(t_crt_params)); // get command + args wcnt=0; @@ -393,6 +398,14 @@ int mdrun_parse_config(t_mdrun *mdrun) { continue; } + // offset + if(word[i][0]=='o') { + fp.o_params.o.x=atof(word[++i])*fp.lc; + fp.o_params.o.y=atof(word[++i])*fp.lc; + fp.o_params.o.z=atof(word[++i])*fp.lc; + fp.o_params.use=1; + continue; + } i+=1; } add_stage(mdrun,STAGE_FILL,&fp); @@ -414,6 +427,8 @@ int mdrun_parse_config(t_mdrun *mdrun) { case 'e': cap.type|=CHAATTR_ELEMENT; break; + case 'n': + cap.type|=CHAATTR_NUMBER; default: break; } @@ -432,6 +447,10 @@ int mdrun_parse_config(t_mdrun *mdrun) { cap.element=atoi(word[i]); i+=1; } + if(cap.type&CHAATTR_NUMBER) { + cap.element=atoi(word[i]); + i+=1; + } for(o=0;ox0; y0=iap->y0; z0=iap->z0; @@ -903,7 +935,7 @@ int insert_atoms(t_moldyn *moldyn,t_mdrun *mdrun) { while(cntins_atoms) { run=1; while(run) { - if(iap->type!=INS_POS) { + if((iap->type!=INS_POS)&&(iap->type!=INS_RELPOS)) { r.x=rand_get_double(&(moldyn->random))*x; r.y=rand_get_double(&(moldyn->random))*y; r.z=rand_get_double(&(moldyn->random))*z; @@ -913,9 +945,16 @@ int insert_atoms(t_moldyn *moldyn,t_mdrun *mdrun) { r.y=0.0; r.z=0.0; } - r.x+=x0; - r.y+=y0; - r.z+=z0; + if(iap->type==INS_RELPOS) { + r.x+=x0*mdrun->lc; + r.y+=y0*mdrun->lc; + r.z+=z0*mdrun->lc; + } + else { + r.x+=x0; + r.y+=y0; + r.z+=z0; + } // offset if(iap->type!=INS_TOTAL) { r.x+=o; @@ -1094,6 +1133,10 @@ int chaatr(t_moldyn *moldyn,t_mdrun *mdrun) { if(cap->element!=atom->element) continue; } + if(cap->type&CHAATTR_NUMBER) { + if(cap->element!=atom->tag) + continue; + } if(cap->type&CHAATTR_REGION) { if(cap->x0>atom->r.x) continue; @@ -1108,7 +1151,9 @@ int chaatr(t_moldyn *moldyn,t_mdrun *mdrun) { if(cap->z1r.z) continue; } - printf(" changing attributes of atom %d (0x%x)\n",i,cap->attr); + if(!(cap->type&CHAATTR_TOTALV)) + printf(" changing attributes of atom %d (0x%x)\n", + i,cap->attr); atom->attr=cap->attr; } @@ -1164,6 +1209,106 @@ int chsattr(t_moldyn *moldyn,t_mdrun *mdrun) { return 0; } +int crt(t_moldyn *moldyn,t_mdrun *mdrun) { + + t_stage *stage; + t_crt_params *crtp; + + int fd; + char line[128]; + char *wptr; + int acount; + int ret; + void *ptr; + + extern u8 crt; + extern u8 *constraints; + extern double *trafo_angles; + + t_atom *atom; + double dx,dy,dz; + + stage=mdrun->stage.current->data; + crtp=stage->params; + + acount=0; + + /* initial stuff */ + + if(crtp->count==0) { + printf(" crt init\n",acount); + // read final positions, constraints and do the alloc + fd=open(crtp->file,O_RDONLY); + if(fd<0) { + perror("[mdrun] FATAL reading constraints file"); + return fd; + } + while(1) { + ret=get_line(fd,line,128); + // check for end of file + if(ret<=0) { + printf(" -> read %d atom positions\n",acount); + crtp->acnt=acount; + break; + } + // ignore # lines and \n + if((line[0]=='#')|(ret==1)) + continue; + // allocate new memory + ptr=realloc(crtp->r_fin,(acount+1)*sizeof(t_3dvec)); + if(ptr==NULL) { + perror("[mdrun] FATAL realloc crt positions"); + return -1; + } + crtp->r_fin=ptr; + ptr=realloc(constraints,(acount+1)*3*sizeof(u8)); + if(ptr==NULL) { + perror("[mdrun] FATAL realloc crt constraints"); + return -1; + } + constraints=ptr; + // ignore type + wptr=strtok(line," \t"); + // read x y z + wptr=strtok(NULL," \t"); + crtp->r_fin.x=atof(wptr); + wptr=strtok(NULL," \t"); + crtp->r_fin.y=atof(wptr); + wptr=strtok(NULL," \t"); + crtp->r_fin.z=atof(wptr); + // read constraints + wptr=strtok(NULL," \t"); + constraints[acount]=atoi(wptr); + wptr=strtok(NULL," \t"); + constraints[acount+1]=atoi(wptr); + wptr=strtok(NULL," \t"); + constraints[acount+2]=atoi(wptr); + // done reading + acount+=1; + } + // allocate trafo angles + trafo_angle=malloc(acount*2*sizeof(double)); + if(trafo_angle==NULL) { + perror("[mdrun] FATAL alloc trafo angles"); + return -1; + } + // set crt mode + crt=crtp->type; + } + + /* crt routines: calculate displacement + set individual constraints */ + + for(i=0;icount;i++) { + 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 + } + + return 0; +} + #define stage_print(m) if(!(stage->executed)) \ printf("%s",m) @@ -1315,7 +1460,8 @@ int mdrun_hook(void *ptr1,void *ptr2) { fp->lx,fp->ly,fp->lz, &o, &(fp->p_params), - &(fp->d_params)); + &(fp->d_params), + &(fp->o_params)); o.x+=0.25*fp->lc; o.y=o.x; o.z=o.x; @@ -1326,7 +1472,8 @@ int mdrun_hook(void *ptr1,void *ptr2) { fp->lx,fp->ly,fp->lz, &o, &(fp->p_params), - &(fp->d_params)); + &(fp->d_params), + &(fp->o_params)); break; default: @@ -1339,7 +1486,8 @@ int mdrun_hook(void *ptr1,void *ptr2) { fp->lx,fp->ly,fp->lz, NULL, &(fp->p_params), - &(fp->d_params)); + &(fp->d_params), + &(fp->o_params)); break; } moldyn_bc_check(moldyn); @@ -1350,6 +1498,17 @@ int mdrun_hook(void *ptr1,void *ptr2) { thermal_init(moldyn,TRUE); change_stage=TRUE; break; + case STAGE_CRT: + stage_print(" -> constraint relaxation") + stage_print(" technique\n\n"); + crtp=stage->params; + if(crtp->count==crtp->steps) { + change_stage=TRUE; + break; + } + crt(moldyn,mdrun); + crtp->count+=1; + break; default: printf("%s unknwon stage type\n",ME); break;