diff options
| author | Ian Jauslin <ian.jauslin@roma1.infn.it> | 2015-07-22 13:55:29 +0000 | 
|---|---|---|
| committer | Ian Jauslin <ian.jauslin@roma1.infn.it> | 2015-07-22 13:55:29 +0000 | 
| commit | f13eacbc8e5ab714dd3544adab8189c313382c77 (patch) | |
| tree | efd35fca778e6e343206f48918898a8b4cda9977 /src/kondo.c | |
| parent | 3b591888b5dad7cef02170743a92e2bf9c5831db (diff) | |
Support for non-commuting fieldsv1.3
Diffstat (limited to 'src/kondo.c')
| -rw-r--r-- | src/kondo.c | 150 | 
1 files changed, 73 insertions, 77 deletions
diff --git a/src/kondo.c b/src/kondo.c index 39d74bb..79b7c56 100644 --- a/src/kondo.c +++ b/src/kondo.c @@ -29,16 +29,17 @@ limitations under the License.  #include "definitions.cpp"  #include "rational.h" -// dimension of A, B and h (must be <10) +// dimension of A, B, h and t (must be <10)  #define KONDO_DIM 3  // number of spin components  #define KONDO_SPIN 2 -// offsets for indices of A, B and h +// offsets for indices of A, B, h and t  // order matters for symbols table  #define KONDO_A_OFFSET 1  #define KONDO_B_OFFSET 2  #define KONDO_H_OFFSET 3 +#define KONDO_T_OFFSET 4  // parsing modes (from parse_file.c)  #define PP_NULL_MODE 0 @@ -193,13 +194,19 @@ int kondo_fields_table(int box_count, Char_Array* str_fields, Fields_Table* fiel    //  parameters    char_array_append_str("h:",str_fields); +  // h    for(i=0;i<KONDO_DIM;i++){ -    char_array_snprintf(str_fields, "%d", 10*(i+10*KONDO_H_OFFSET)); +    char_array_snprintf(str_fields, "%d,", 10*(i+10*KONDO_H_OFFSET)); +  } +  // t +  for(i=0;i<KONDO_DIM;i++){ +    char_array_snprintf(str_fields, "%d", 10*(i+10*KONDO_T_OFFSET));      if(i<KONDO_DIM-1){ -      char_array_append(',',str_fields); +      char_array_append(',', str_fields);      }    } -  char_array_append('\n',str_fields); +  char_array_append('\n', str_fields); +    // declare Fermions    char_array_append_str("f:",str_fields); @@ -226,6 +233,16 @@ int kondo_fields_table(int box_count, Char_Array* str_fields, Fields_Table* fiel    }    char_array_append('\n',str_fields); +  // declare noncommuting +  char_array_append_str("a:",str_fields); +  for(i=0;i<KONDO_DIM;i++){ +    char_array_snprintf(str_fields, "%d", 10*(i+10*KONDO_T_OFFSET)); +    if(i<KONDO_DIM-1){ +      char_array_append(',',str_fields); +    } +  } +  char_array_append('\n', str_fields); +    // parse fields table    parse_input_fields(*str_fields, fields); @@ -245,7 +262,7 @@ int kondo_symbols(Char_Array* str_symbols, int box_count, Fields_Table* fields){    // loop over box index    for(i=1;i<=box_count;i++){ -    // loop over letters +    // loop over letters (A and B)      for(j=0;j<2;j++){        // loop over space dimension        for(k=0;k<KONDO_DIM;k++){ @@ -255,7 +272,7 @@ int kondo_symbols(Char_Array* str_symbols, int box_count, Fields_Table* fields){  	init_Char_Array(&tmp_str, 6);  	char_array_snprintf(&tmp_str, "%c%d%d", letters[j], k, i);  	// compute corresponding polynomial -	kondo_resolve_ABh(tmp_str.str, &poly, *fields); +	kondo_resolve_ABht(tmp_str.str, &poly, *fields);  	free_Char_Array(tmp_str);  	// write to output  	polynomial_sprint(poly, str_symbols); @@ -320,45 +337,6 @@ int kondo_symbols(Char_Array* str_symbols, int box_count, Fields_Table* fields){    return(0);  } -// generate Kondo symbols (older method: one symbol for each scalar product) -int kondo_symbols_scalarprod(Char_Array* str_symbols, int box_count, Fields_Table* fields){ -  int i,j,k; -  Char_Array tmp_str; -  Polynomial poly; -  char letters[3]={'A','B','h'}; - -  init_Char_Array(str_symbols, STR_SIZE); -  char_array_snprintf(str_symbols, "#!symbols\n"); - -  // loop over box index -  for(i=1;i<=box_count;i++){ -    // loop over letters -    for(j=0;j<3;j++){ -      for(k=0;k<3;k++){ -	// write index -	char_array_snprintf(str_symbols, "%d=", 100*(10*(KONDO_A_OFFSET+j)+KONDO_A_OFFSET+k)+i); -	// write the name of the scalar product -	init_Char_Array(&tmp_str, 6); -	char_array_snprintf(&tmp_str, "%c%d.%c%d", letters[j], i, letters[k], i); -	// compute corresponding polynomial -	kondo_resolve_scalar_prod(tmp_str.str, &poly, *fields); -	free_Char_Array(tmp_str); -	// write to output -	polynomial_sprint(poly, str_symbols); -	free_Polynomial(poly); -	// add , -	if(i<box_count || j<2 || k<2){ -	  char_array_snprintf(str_symbols,",\n"); -	} -      } -    } -  } - -  parse_input_symbols(*str_symbols, fields); - -  return(0); -} -  // generate Kondo groups (groups of independent variables)  int kondo_groups(Char_Array* str_groups, int box_count){ @@ -395,12 +373,21 @@ int kondo_groups(Char_Array* str_groups, int box_count){  // generate Kondo identities  // h_3^2=1-h_1^2-h_2^2 +// and Pauli matrices  int kondo_identities(Char_Array* str_identities){    int i;    init_Char_Array(str_identities,STR_SIZE);    char_array_snprintf(str_identities, "#!identities\n"); +  // Pauli matrices +  for(i=0;i<KONDO_DIM;i++){ +    char_array_snprintf(str_identities,"[f%d][f%d]=(1),\n",10*(10*KONDO_T_OFFSET+i),10*(10*KONDO_T_OFFSET+i)); +    char_array_snprintf(str_identities,"[f%d][f%d]=(s{-1})[f%d],\n",10*(10*KONDO_T_OFFSET+i),10*(10*KONDO_T_OFFSET+(i+1)%3),10*(10*KONDO_T_OFFSET+(i+2)%3)); +    char_array_snprintf(str_identities,"[f%d][f%d]=((-1)s{-1})[f%d],\n",10*(10*KONDO_T_OFFSET+(i+2)%3),10*(10*KONDO_T_OFFSET+(i+1)%3),10*(10*KONDO_T_OFFSET+i)); +  } + +  // h    char_array_snprintf(str_identities, "[f%d][f%d]=(1)",10*(KONDO_DIM-1+10*KONDO_H_OFFSET),10*(KONDO_DIM-1+10*KONDO_H_OFFSET));    for(i=0;i<KONDO_DIM-1;i++){      char_array_snprintf(str_identities, "+(-1)[f%d][f%d]",10*(i+10*KONDO_H_OFFSET),10*(i+10*KONDO_H_OFFSET)); @@ -809,11 +796,10 @@ int parse_kondo_polynomial_str(char* str_polynomial, Polynomial* output, Fields_  	  if(tmp_poly.length>0){  	    for(i=0;i<tmp_poly.length;i++){  	      if(mode==PP_FIELD_SCALAR_MODE){ -		if(offset1!=KONDO_H_OFFSET || offset2!=KONDO_H_OFFSET){ -		  int_array_append(1000*(10*offset1+offset2)+index, tmp_poly.monomials+i); -		} +		int_array_append(1000*(10*offset1+offset2)+index, tmp_poly.monomials+i);  	      }  	      else{ +		// vector product  		int_array_append(100*(100*KONDO_A_OFFSET+10*KONDO_B_OFFSET+KONDO_H_OFFSET)+index, tmp_poly.monomials+i);  	      }  	    } @@ -822,28 +808,15 @@ int parse_kondo_polynomial_str(char* str_polynomial, Polynomial* output, Fields_  	  else{  	    init_Int_Array(&tmp_monomial, MONOMIAL_SIZE);  	    if(mode==PP_FIELD_SCALAR_MODE){ -	      if(offset1!=KONDO_H_OFFSET || offset2!=KONDO_H_OFFSET){ -		int_array_append(1000*(10*offset1+offset2)+index, &tmp_monomial); -	      } +	      int_array_append(1000*(10*offset1+offset2)+index, &tmp_monomial);  	    }  	    else{ +	      // vector product  	      int_array_append(100*(100*KONDO_A_OFFSET+10*KONDO_B_OFFSET+KONDO_H_OFFSET)+index, &tmp_monomial);  	    }  	    init_Int_Array(&dummy_factor, 1);  	    polynomial_append_noinit(tmp_monomial, dummy_factor, number_one(), &tmp_poly);  	  } -	  /* // older method in which a scalar product was expanded in A, B and h -	  // resolve scalar product -	  kondo_resolve_scalar_prod_symbols(buffer, &scalar_prod_poly); -	  // add to tmp_poly -	  if(tmp_poly.length==0){ -	    polynomial_concat(scalar_prod_poly,&tmp_poly); -	  } -	  else{ -	    polynomial_prod_chain(scalar_prod_poly,&tmp_poly,fields); -	  } -	  free_Polynomial(scalar_prod_poly); -	  */  	}  	// switch back to null mode  	mode=PP_NULL_MODE; @@ -941,10 +914,10 @@ int parse_kondo_polynomial(Char_Array kondo_polynomial_str, Polynomial* polynomi  } -// read Aij, Bij, hi where i is a space dimension and j is a box index -int kondo_resolve_ABh(char* str, Polynomial* output, Fields_Table fields){ +// read Aij, Bij, hi, ti where i is a space dimension and j is a box index +int kondo_resolve_ABht(char* str, Polynomial* output, Fields_Table fields){    char* ptr; -  // offset (A,B or H) +  // offset (A,B, H or T)    int offset=-1;    // dimension    int dim=-1; @@ -978,6 +951,9 @@ int kondo_resolve_ABh(char* str, Polynomial* output, Fields_Table fields){      case 'h':        offset=KONDO_H_OFFSET;        break; +    case 't': +      offset=KONDO_T_OFFSET; +      break;      default:        // set index if dim was already set        if(dim>=0){ @@ -1001,8 +977,8 @@ int kondo_resolve_ABh(char* str, Polynomial* output, Fields_Table fields){      }    } -  // h's -  if(offset==KONDO_H_OFFSET){ +  // h's and t's +  if(offset==KONDO_H_OFFSET || offset==KONDO_T_OFFSET){      // external field      init_Int_Array(&monomial,1);      init_Int_Array(&factor,1); @@ -1062,7 +1038,7 @@ int kondo_resolve_ABh(char* str, Polynomial* output, Fields_Table fields){  // read a Kondo scalar product (generalized to vector products as well)  int kondo_resolve_scalar_prod(char* str, Polynomial* output, Fields_Table fields){    char* ptr; -  // offset of each term (A,B or H) +  // offset of each term (A,B,H or T)    int offset=-1;    // index of each term (0,...,box_count)    int index=0; @@ -1091,6 +1067,9 @@ int kondo_resolve_scalar_prod(char* str, Polynomial* output, Fields_Table fields      case 'h':        offset=KONDO_H_OFFSET;        break; +    case 't': +      offset=KONDO_T_OFFSET; +      break;      // scalar product      case '.': @@ -1195,8 +1174,8 @@ int kondo_polynomial_vector(int offset, int index, Polynomial (*polys)[3], Field      init_Polynomial((*polys)+i,POLY_SIZE);    } -  // h's -  if(offset==KONDO_H_OFFSET){ +  // h's and t's +  if(offset==KONDO_H_OFFSET || offset==KONDO_T_OFFSET){      // construct every component field      for(i=0;i<KONDO_DIM;i++){        // external field @@ -1261,7 +1240,7 @@ int kondo_resolve_scalar_prod_symbols(char* str, Polynomial* output){    char* ptr;    // first or second term    int term=0; -  // offset of each term (A,B or H) +  // offset of each term (A,B,H or T)    int offset[2];    // index of each term (0,...,box_count)    int index[2]={0,0}; @@ -1289,6 +1268,9 @@ int kondo_resolve_scalar_prod_symbols(char* str, Polynomial* output){      case 'h':        offset[term]=KONDO_H_OFFSET;        break; +    case 't': +      offset[term]=KONDO_T_OFFSET; +      break;      // switch term      case '.':        term=1-term; @@ -1304,13 +1286,13 @@ int kondo_resolve_scalar_prod_symbols(char* str, Polynomial* output){      init_Int_Array(&monomial,2);      init_Int_Array(&factor, 1); -    if(offset[0]==KONDO_H_OFFSET){ +    if(offset[0]==KONDO_H_OFFSET || offset[0]==KONDO_T_OFFSET){        int_array_append(10*(10*offset[0]+i)+index[0], &monomial);      }      else{        int_array_append(100*(10*offset[0]+i)+index[0], &monomial);      } -    if(offset[1]==KONDO_H_OFFSET){ +    if(offset[1]==KONDO_H_OFFSET || offset[1]==KONDO_T_OFFSET){        int_array_append(10*(10*offset[1]+i)+index[1], &monomial);      }      else{ @@ -1344,6 +1326,9 @@ int get_offset_index(char* str, int* offset, int* index){      case 'h':        *offset=KONDO_H_OFFSET;        break; +    case 't': +      *offset=KONDO_T_OFFSET; +      break;      default:        // char to int        *index=*ptr-'0'; @@ -1378,6 +1363,9 @@ int get_offsets_index(char* str, int* offset1, int* offset2, int* index){      case 'h':        offset[term]=KONDO_H_OFFSET;        break; +    case 't': +      offset[term]=KONDO_T_OFFSET; +      break;      // switch term      case '.':        term=1-term; @@ -1391,6 +1379,11 @@ int get_offsets_index(char* str, int* offset1, int* offset2, int* index){    *offset1=offset[0];    *offset2=offset[1]; +  // if no A's or B's, then index=0 +  if((offset[0]==KONDO_H_OFFSET || offset[0]==KONDO_T_OFFSET) && (offset[1]==KONDO_H_OFFSET || offset[1]==KONDO_T_OFFSET)){ +    *index=0; +  } +    return(0);  } @@ -1429,6 +1422,9 @@ int get_symbol_index(char* str){      case 'h':        offset=KONDO_H_OFFSET;        break; +    case 't': +      offset=KONDO_T_OFFSET; +      break;      default:        // set index if dim was already set        if(dim>=0){ @@ -1443,8 +1439,8 @@ int get_symbol_index(char* str){    if(offset==-1){      return(-1);    } -  // no symbol for h -  if(offset==KONDO_H_OFFSET){ +  // no symbol for h or t +  if(offset==KONDO_H_OFFSET || offset==KONDO_T_OFFSET){      return(10*(10*offset+dim));    }    else{  | 
