some checkins
[physik/posic.git] / mdrun.c
diff --git a/mdrun.c b/mdrun.c
index 31e5f0a..29e5e48 100644 (file)
--- a/mdrun.c
+++ b/mdrun.c
@@ -393,6 +393,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 +422,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 +442,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;o<strlen(word[i]);o++) {
                                switch(word[i][o]) {
                                        case 'b':
@@ -583,6 +597,12 @@ int mdrun_parse_config(t_mdrun *mdrun) {
                                                iap.y0=atof(word[9]);
                                                iap.z0=atof(word[10]);
                                                break;
+                                       case 'P':
+                                               iap.type=INS_RELPOS;
+                                               iap.x0=atof(word[8]);
+                                               iap.y0=atof(word[9]);
+                                               iap.z0=atof(word[10]);
+                                               break;
                                        case 'r':
                                                switch(word[8][0]) {
 
@@ -888,6 +908,7 @@ int insert_atoms(t_moldyn *moldyn,t_mdrun *mdrun) {
                        cr_check=TRUE;
                        break;
                case INS_POS:
+               case INS_RELPOS:
                        x0=iap->x0;
                        y0=iap->y0;
                        z0=iap->z0;
@@ -903,7 +924,7 @@ int insert_atoms(t_moldyn *moldyn,t_mdrun *mdrun) {
        while(cnt<iap->ins_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 +934,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 +1122,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 +1140,9 @@ int chaatr(t_moldyn *moldyn,t_mdrun *mdrun) {
                        if(cap->z1<atom->r.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;
        }
 
@@ -1315,7 +1349,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 +1361,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 +1375,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);