fixed compile errors, no testing yet!
authorhackbard <hackbard@sage.physik.uni-augsburg.de>
Tue, 29 Apr 2008 09:23:17 +0000 (11:23 +0200)
committerhackbard <hackbard@sage.physik.uni-augsburg.de>
Tue, 29 Apr 2008 09:23:17 +0000 (11:23 +0200)
config.default
mdrun.c
mdrun.h
moldyn.c

index 0bd26d2..e9181be 100644 (file)
@@ -22,14 +22,6 @@ pbc 1 1 1
 temperature 450.0
 pressure 0.0
 
-## ensemble control ##
-
-ectrl 100.0 100.0
-
-## equi ctrl ##
-
-equictrl 1.0 1.0
-
 ## initial lattice ##
 
 lattice diamond
@@ -38,31 +30,25 @@ element1 silicon
 #element2 carbon
 fill lc 9 9 9
 
-aattr all h
+## atom attributes ##
+
+aattr t h123
 
 ## initial simulation run ##
 
 prerun 100
 avgskip 0
 
-## more stages ##
+## system attributes, eg ensemble ctrl, equi ctrl, relaxation steps ##
 
-# format:
-# stage <action> <attr>
-#
-# actions:
-#
-# ins_atoms <#insertions> <#atoms> <element> \
-#           <#atom-attrib> <position>
-#
-# continue <#runs>
-#
-# anneal <#annealing-steps> <delta_t>
+sattr pctrl 100.0 tctrl 100.0 prelax 1.0 trelax 1.0 rsteps 100 avgrst 1
+
+## more stages ##
 
-stage ins_atoms 10 1 14 v h rand 0 0 0 11 11 11
-stage ins_atoms 1 1 6 v h rand 0 0 0 5.429 5.429 5.429
+stage ins_atoms 10 1 14 0 vh123 rand -5.5 -5.5 -5.5 5.5 5.5 5.5
+stage ins_atoms 1 1 6 1 vh123 rand 0 0 0 5.429 5.429 5.429
 stage continue 10000
-stage anneal 723 -1.0
+#stage anneal 723 -1.0
 
 ## report / log / visualization / save files ##
 
diff --git a/mdrun.c b/mdrun.c
index 6f7a2f0..c4b6df2 100644 (file)
--- a/mdrun.c
+++ b/mdrun.c
@@ -62,12 +62,12 @@ int mdrun_parse_argv(t_mdrun *mdrun,int argc,char **argv) {
        return 0;
 }
 
-del_stages(t_mdrun *mdrun) {
+int del_stages(t_mdrun *mdrun) {
 
        t_list *sl;
        t_stage *stage;
 
-       sl=mdrun->stage;
+       sl=&(mdrun->stage);
 
        list_reset_f(sl);
 
@@ -83,7 +83,7 @@ del_stages(t_mdrun *mdrun) {
        return 0;
 }
 
-add_stage(t_mdrun *mdrun,u8 type,void *params) {
+int add_stage(t_mdrun *mdrun,u8 type,void *params) {
 
        int psize;
 
@@ -106,7 +106,8 @@ add_stage(t_mdrun *mdrun,u8 type,void *params) {
                        psize=sizeof(t_chsattr_params);
                        break;
                default:
-
+                       printf("%s unknown stage type: %02x\n",ME,type);
+                       return -1;
        }
 
        stage=malloc(sizeof(t_stage));
@@ -126,7 +127,7 @@ add_stage(t_mdrun *mdrun,u8 type,void *params) {
 
        memcpy(stage->params,params,psize);
 
-       list_add_immediate_f(mdrun->stage,stage);
+       list_add_immediate_f(&(mdrun->stage),stage);
 
        return 0;
 }
@@ -168,6 +169,13 @@ int mdrun_parse_config(t_mdrun *mdrun) {
                if((line[0]=='#')|(ret==1))
                        continue;
 
+               // reset
+               memset(&iap,0,sizeof(t_insert_atoms_params));
+               memset(&cp,0,sizeof(t_continue_params));
+               memset(&ap,0,sizeof(t_anneal_params));
+               memset(&cap,0,sizeof(t_chaattr_params));
+               memset(&csp,0,sizeof(t_chsattr_params));
+
                // get command + args
                wcnt=0;
                while(1) {
@@ -271,13 +279,37 @@ int mdrun_parse_config(t_mdrun *mdrun) {
                else if(!strncmp(word[0],"aattr",5)) {
                        // for aatrib line we need a special stage
                        // containing one schedule of 0 loops ...
-                       if(!strncmp(word[1],"all",3)) {
-                               cap.type=
-
-
-                               HIER WEITER
+                       for(i=0;i<strlen(word[1]);i++) {
+                               switch(word[1][i]) {
+                                       case 't':
+                                               cap.type|=CHAATTR_TOTALV;
+                                               break;
+                                       case 'r':
+                                               cap.type|=CHAATTR_REGION;
+                                               break;
+                                       case 'e':
+                                               cap.type|=CHAATTR_ELEMENT;
+                                               break;
+                                       default:
+                                               break;
+                               }
+                       }
+                       i=1;
+                       if(cap.type&CHAATTR_REGION) {
+                               cap.x0=atof(word[1]);   
+                               cap.y0=atof(word[2]);   
+                               cap.z0=atof(word[3]);   
+                               cap.x1=atof(word[4]);   
+                               cap.y1=atof(word[5]);   
+                               cap.z1=atof(word[6]);
+                               i+=6;
                        }
-                       for(i=0;i<strlen(wptr)) {
+                       if(cap.type&CHAATTR_ELEMENT) {
+                               cap.element=atoi(word[i]);
+                               i+=1;
+                       }
+                       wptr=word[i];
+                       for(i=0;i<strlen(wptr);i++) {
                                switch(word[2][i]) {
                                        case 'b':
                                                cap.attr|=ATOM_ATTR_VB;
@@ -306,9 +338,30 @@ int mdrun_parse_config(t_mdrun *mdrun) {
                        }
                        add_stage(mdrun,STAGE_CHAATTR,&cap);
                }
-               else if(!strncmp(word[0],"ectrl",5)) {
-                       mdrun->p_tau=atof(word[1]);
-                       mdrun->t_tau=atof(word[2]);
+               else if(!strncmp(word[0],"sattr",5)) {
+                       // for satrib line we need a special stage
+                       // containing one schedule of 0 loops ...
+                       for(i=1;i<wcnt;i++) {
+                               if(!strncmp(word[i],"pctrl",5)) {
+                                       csp.ptau=atof(word[++i]);
+                               }
+                               if(!strncmp(word[i],"tctrl",5)) {
+                                       csp.ttau=atof(word[++i]);
+                               }
+                               if(!strncmp(word[i],"prelax",6)) {
+                                       csp.dp=atof(word[++i]);
+                               }
+                               if(!strncmp(word[i],"trelax",6)) {
+                                       csp.dt=atof(word[++i]);
+                               }
+                               if(!strncmp(word[i],"rsteps",6)) {
+                                       csp.rsteps=atoi(word[++i]);
+                               }
+                               if(!strncmp(word[i],"avgrst",6)) {
+                                       csp.avgrst=atoi(word[++i]);
+                               }
+                       }
+                       add_stage(mdrun,STAGE_CHSATTR,&csp);
                }
                else if(!strncmp(word[0],"prerun",6))
                        mdrun->prerun=atoi(word[1]);
@@ -328,10 +381,72 @@ int mdrun_parse_config(t_mdrun *mdrun) {
                        mdrun->visualize=atoi(word[1]);
                else if(!strncmp(word[0],"stage",5)) {
                        // for every stage line, add a stage
-                       printf("%s stage: %s\n",ME,word[1]);
+                       if(!strncmp(word[1],"ins_atoms",9)) {
+                               iap.ins_steps=atoi(word[2]);
+                               iap.ins_atoms=atoi(word[3]);
+                               iap.element=atoi(word[4]);
+                               iap.element=atoi(word[4]);
+                               iap.brand=atoi(word[5]);
+                               for(i=0;i<strlen(word[6]);i++) {
+                                       switch(word[6][i]) {
+                                               case 'b':
+                                                       iap.attr|=ATOM_ATTR_VB;
+                                                       break;
+                                               case 'h':
+                                                       iap.attr|=ATOM_ATTR_HB;
+                                                       break;
+                                               case 'v':
+                                                       iap.attr|=ATOM_ATTR_VA;
+                                                       break;
+                                               case 'f':
+                                                       iap.attr|=ATOM_ATTR_FP;
+                                                       break;
+                                               case '1':
+                                                       iap.attr|=ATOM_ATTR_1BP;
+                                                       break;
+                                               case '2':
+                                                       iap.attr|=ATOM_ATTR_2BP;
+                                                       break;
+                                               case '3':
+                                                       iap.attr|=ATOM_ATTR_3BP;
+                                                       break;
+                                               default:
+                                                       break;
+                                       }
+                               }
+                               // only rand mode by now
+                               if(word[8][0]=='t')
+                                       iap.type=INS_TOTAL;
+                               else {
+                                       iap.type=INS_REGION;
+                                       iap.x0=atof(word[8]);
+                                       iap.y0=atof(word[9]);
+                                       iap.z0=atof(word[10]);
+                                       iap.x1=atof(word[11]);
+                                       iap.y1=atof(word[12]);
+                                       iap.z1=atof(word[13]);
+                               }
+                               add_stage(mdrun,STAGE_INSERT_ATOMS,&iap);
+                       }
+                       else if(!strncmp(word[1],"continue",8)) {
+                               cp.runs=atoi(word[2]);
+                               add_stage(mdrun,STAGE_CONTINUE,&cp);
+                       }
+                       else if(!strncmp(word[1],"anneal",6)) {
+                               ap.count=0;
+                               ap.runs=atoi(word[2]);
+                               ap.dt=atof(word[3]);
+                               add_stage(mdrun,STAGE_ANNEAL,&ap);
+                       }
+                       else {
+                               printf("%s unknown stage type: %s\n",
+                                      ME,word[1]);
+                               return -1;
+                       }
                }
                else {
-                       printf("%s unknown command %s, skipped!\n",ME,word[0]);
+                       printf("%s unknown keyword '%s', skipped!\n",
+                              ME,word[0]);
                        continue;
                }
        }
@@ -380,7 +495,7 @@ int check_temperature(t_moldyn *moldyn,t_mdrun *mdrun) {
 
 int insert_atoms(t_moldyn *moldyn,t_mdrun *mdrun) {
 
-       insert_atoms_params *iap;
+       t_insert_atoms_params *iap;
        t_stage *stage;
        t_atom *atom;
        t_3dvec r,v,dist;
@@ -390,7 +505,7 @@ int insert_atoms(t_moldyn *moldyn,t_mdrun *mdrun) {
        double x0,y0,z0;
        u8 cr_check,run;
        
-       stage=mdrun->stage->current->data;
+       stage=mdrun->stage.current->data;
        iap=stage->params;
 
        cr_check=FALSE;
@@ -417,7 +532,8 @@ int insert_atoms(t_moldyn *moldyn,t_mdrun *mdrun) {
                        cr_check=TRUE;
                        break;
                default:
-                       printf("%s unknown insertion mode\n");
+                       printf("%s unknown insertion mode: %02x\n",
+                              ME,iap->type);
                        return -1;
        }
 
@@ -455,14 +571,14 @@ int insert_atoms(t_moldyn *moldyn,t_mdrun *mdrun) {
        return 0;
 }
 
-int chaatrib(t_moldyn *moldyn,t_mdrun *mdrun) {
+int chaatr(t_moldyn *moldyn,t_mdrun *mdrun) {
 
        t_stage *stage;
        t_chaattr_params *cap;
        t_atom *atom;
-       u8 assigne;
+       int i;
 
-       stage=mdrun->stage->current->data;
+       stage=mdrun->stage.current->data;
        cap=stage->params;
 
        for(i=0;i<moldyn->count;i++) {
@@ -496,41 +612,51 @@ int chsattr(t_moldyn *moldyn,t_mdrun *mdrun) {
        t_stage *stage;
        t_chsattr_params *csp;
 
-       stage=mdrun->stage->current->data;
+       stage=mdrun->stage.current->data;
        csp=stage->params;
 
-       switch(csp->type) {
-               case CHSATTR_PCTRL:
-                       set_p_scale(moldyn,csp->ctrl_type,csp->tau);
-                       break;
-               case CHSATTR_TCTRL:
-                       set_t_scale(moldyn,csp->ctrl_type,csp->tau);
-                       break;
-               case CHSATTR_PRELAX:
-                       mdrun->sattr&=(^(SATTR_PRELAX));
-                       if(csp->ctrl==TRUE)
-                               mdrun->sattr|=SATTR_PRELAX;
-                       break;
-               case CHSATTR_TRELAX:
-                       mdrun->sattr&=(^(SATTR_TRELAX));
-                       if(csp->ctrl==TRUE)
-                               mdrun->sattr|=SATTR_TRELAX;
-                       break;
-               case CHSATTR_AVGRST:
-                       mdrun->sattr&=(^(SATTR_AVGRST));
-                       if(csp->ctrl==TRUE)
-                               mdrun->sattr|=SATTR_AVGRST;
-                       break;
-               default:
-                       printf("%s unknown system attribute change\n",ME);
-                       return -1;
+       if(csp->type&CHSATTR_PCTRL) {
+               if(csp->ptau>0)
+                       set_p_scale(moldyn,P_SCALE_BERENDSEN,csp->ptau);
+               else
+                       set_p_scale(moldyn,P_SCALE_BERENDSEN,csp->ptau);
+       }
+       if(csp->type&CHSATTR_TCTRL) {
+               if(csp->ttau>0)
+                       set_t_scale(moldyn,T_SCALE_BERENDSEN,csp->ttau);
+               else
+                       set_t_scale(moldyn,T_SCALE_BERENDSEN,csp->ttau);
+       }
+       if(csp->type&CHSATTR_PRELAX) {
+               if(csp->dp<0)
+                       mdrun->sattr&=(~(SATTR_PRELAX));
+               else
+                       mdrun->sattr|=SATTR_PRELAX;
+               mdrun->dp=csp->dp;
+       }
+       if(csp->type&CHSATTR_TRELAX) {
+               if(csp->dt<0)
+                       mdrun->sattr&=(~(SATTR_TRELAX));
+               else
+                       mdrun->sattr|=SATTR_TRELAX;
+               mdrun->dt=csp->dt;
+       }
+       if(csp->type&CHSATTR_AVGRST) {
+               if(csp->avgrst)
+                       mdrun->sattr|=CHSATTR_AVGRST;
+               else
+                       mdrun->sattr&=(~(CHSATTR_AVGRST));
+       }
+       if(csp->type&CHSATTR_RSTEPS) {
+               mdrun->relax_steps=csp->rsteps;
        }
 
        return 0;
 }
 
-int mdrun_hook(t_moldyn *moldyn,void *ptr) {
+int mdrun_hook(void *ptr1,void *ptr2) {
 
+       t_moldyn *moldyn;
        t_mdrun *mdrun;
        t_stage *stage;
        t_list *sl;
@@ -542,8 +668,10 @@ int mdrun_hook(t_moldyn *moldyn,void *ptr) {
        t_continue_params *cp;
        t_anneal_params *ap;
 
-       mdrun=ptr;
-       sl=mdrun->stage;
+       moldyn=ptr1;
+       mdrun=ptr2;
+
+       sl=&(mdrun->stage);
 
        change_stage=FALSE;
 
@@ -552,14 +680,15 @@ int mdrun_hook(t_moldyn *moldyn,void *ptr) {
                return 0;
 
        /* get stage description */
-       stage=mdrun->sl->current->data;
+       stage=sl->current->data;
 
        /* default steps and tau values */
        steps=mdrun->relax_steps;
        tau=mdrun->timestep;
 
        /* check whether relaxation steps are necessary */
-       if(!((check_pressure==FALSE)|(check_temperature==FALSE))) {
+       if(!((check_pressure(moldyn,mdrun)==FALSE)|\
+            (check_temperature(moldyn,mdrun)==FALSE))) {
                
                /* stage specific stuff */
                switch(stage->type) {
@@ -590,11 +719,11 @@ int mdrun_hook(t_moldyn *moldyn,void *ptr) {
                                ap->count+=1;
                                break;
                        case STAGE_CHAATTR:
-                               chaatrib(moldyn,mdrun);
+                               chaatr(moldyn,mdrun);
                                change_stage=TRUE;
                                break;
                        case STAGE_CHSATTR:
-                               chsatrib(moldyn,mdrun);
+                               chsattr(moldyn,mdrun);
                                change_stage=TRUE;
                                break;
                        default:
@@ -704,7 +833,7 @@ int main(int argc,char **argv) {
                                       mdrun.ly,mdrun.lz,&o);
                        o.x+=0.25*mdrun.lc; o.y=o.x; o.z=o.x;
                        create_lattice(&moldyn,FCC,mdrun.lc,mdrun.element2,
-                                      mdrun.m2,0,0,mdrun.lx,
+                                      mdrun.m2,0,1,mdrun.lx,
                                       mdrun.ly,mdrun.lz,&o);
                        break;
                default:
@@ -734,12 +863,6 @@ int main(int argc,char **argv) {
        moldyn_set_log(&moldyn,CREATE_REPORT,0);
        set_avg_skip(&moldyn,mdrun.avgskip);
 
-       /* pt scaling */
-       if(mdrun.p_tau!=0)
-               set_p_scale(&moldyn,P_SCALE_BERENDSEN,mdrun.p_tau);
-       if(mdrun.t_tau!=0)
-               set_t_scale(&moldyn,T_SCALE_BERENDSEN,mdrun.t_tau);
-
        /* prepare the hook function */
        moldyn_set_schedule_hook(&moldyn,&mdrun_hook,&mdrun);
 
diff --git a/mdrun.h b/mdrun.h
index be8e2a4..20d68d7 100644 (file)
--- a/mdrun.h
+++ b/mdrun.h
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <unistd.h>
 
 #include <math.h>
 
 /* main molecular dynamics api */
 #include "moldyn.h"
 
+/* elements */
+#include "pse.h"
+
 /* list api */
 #include "list/list.h"
 
@@ -73,10 +77,8 @@ typedef struct s_mdrun {
        u8 sattr;                               // system attributes
        double temperature;                     // temperature
        double pressure;                        // pressure
-       double p_tau;                           // pressure tau
-       double t_tau;                           // temperature tau
-       double dp;                              // delta p fpr pctrl
-       double dt;                              // delta t for tctrl
+       double dp;
+       double dt;
        int relax_steps;                        // amount of relaxation steps
 
        int prerun;                             // amount of loops in first run
@@ -91,7 +93,7 @@ typedef struct s_mdrun {
        int avgskip;                            // average skip
        char sdir[128];                         // save root
 
-       t_list *stage;                          // stages
+       t_list stage;                           // stages
        int s_cnt;                              // stage counter
 } t_mdrun;
 
@@ -108,7 +110,7 @@ typedef struct s_insert_atoms_params {
        int ins_atoms;
        int element;
        u8 brand;
-       u8 aattr;
+       u8 attr;
 } t_insert_atoms_params;
 
 #define INS_TOTAL                              0x01
@@ -138,9 +140,12 @@ typedef struct s_chaattr_params {
 
 typedef struct s_chsattr_params {
        u8 type;
-       double tau;
-       u8 ctrl;
-       double delta;
+       double ttau;
+       double ptau;
+       double dt;
+       double dp;
+       int rsteps;
+       u8 avgrst;
 } t_chsattr_params;
 
 #define CHSATTR_PCTRL                          0x01
@@ -148,6 +153,7 @@ typedef struct s_chsattr_params {
 #define CHSATTR_PRELAX                         0x04
 #define CHSATTR_TRELAX                         0x08
 #define CHSATTR_AVGRST                         0x10
+#define CHSATTR_RSTEPS                         0x20
 
 /*
  * function prototypes
index 988b467..832d171 100644 (file)
--- a/moldyn.c
+++ b/moldyn.c
@@ -79,7 +79,8 @@ static char *pse_col[]={
        "Ar",
 };
 
-static double *pse_mass[]={
+/*
+static double pse_mass[]={
        0,
        0,
        0,
@@ -101,7 +102,7 @@ static double *pse_mass[]={
        0,
 };
 
-static double *pse_lc[]={
+static double pse_lc[]={
        0,
        0,
        0,
@@ -122,6 +123,7 @@ static double *pse_lc[]={
        0,
        0,
 };
+*/
 
 /*
  * the moldyn functions
@@ -202,7 +204,7 @@ int set_pressure(t_moldyn *moldyn,double p_ref) {
 
 int set_p_scale(t_moldyn *moldyn,u8 ptype,double ptc) {
 
-       moldyn->pt_scalei&=(^(P_SCALE_MASK));
+       moldyn->pt_scale&=(~(P_SCALE_MASK));
        moldyn->pt_scale|=ptype;
        moldyn->p_tc=ptc;
 
@@ -213,27 +215,17 @@ int set_p_scale(t_moldyn *moldyn,u8 ptype,double ptc) {
                printf(" | type: %02x | factor: %f",ptype,ptc);
        printf("\n");
 
-       printf("  t: %s",ttype?"yes":"no ");
-       if(ttype)
-               printf(" | type: %02x | factor: %f",ttype,ttc);
-       printf("\n");
-
        return 0;
 }
 
 int set_t_scale(t_moldyn *moldyn,u8 ttype,double ttc) {
 
-       moldyn->pt_scalei&=(^(T_SCALE_MASK));
+       moldyn->pt_scale&=(~(T_SCALE_MASK));
        moldyn->pt_scale|=ttype;
        moldyn->t_tc=ttc;
 
        printf("[moldyn] p/t scaling:\n");
 
-       printf("  p: %s",ptype?"yes":"no ");
-       if(ptype)
-               printf(" | type: %02x | factor: %f",ptype,ptc);
-       printf("\n");
-
        printf("  t: %s",ttype?"yes":"no ");
        if(ttype)
                printf(" | type: %02x | factor: %f",ttype,ttc);