/* Copyright 2015-2022 Ian Jauslin Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #include "kondo.h" #include #include #include "idtable.h" #include "array.h" #include "number.h" #include "istring.h" #include "cli_parser.h" #include "fields.h" #include "parse_file.h" #include "polynomial.h" #include "definitions.cpp" #include "rational.h" // 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, h and t // order matters for virtual_fields 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 // when reading a factor #define PP_FACTOR_MODE 1 // reading a monomial #define PP_MONOMIAL_MODE 2 // reading a numerator and denominator #define PP_NUMBER_MODE 3 // types of fields #define PP_FIELD_MODE 6 #define PP_PARAMETER_MODE 7 #define PP_EXTERNAL_MODE 8 #define PP_INTERNAL_MODE 9 // indices #define PP_INDEX_MODE 10 // factors or monomials #define PP_BRACKET_MODE 11 // labels #define PP_LABEL_MODE 12 // polynomial #define PP_POLYNOMIAL_MODE 13 // field scalar product #define PP_FIELD_SCALAR_MODE 14 #define PP_FIELD_VECTOR_PROD_MODE 15 // generate configuration file int kondo_generate_conf(Str_Array* str_args, int box_count){ Str_Array new_args; Fields_Table fields; Variables variables; Char_Array tmp_str; int arg_index; int i; Char_Array title; init_Str_Array(&new_args,8); // fields kondo_fields_table(box_count, &tmp_str, &fields); str_array_append_noinit(tmp_str, &new_args); // dummy variables init_Variables(&variables,1); // virtual fields kondo_virtual_fields(&tmp_str, box_count, &fields); arg_index=find_str_arg("virtual_fields", *str_args); if(arg_index>=0){ if(tmp_str.length>0){ char_array_snprintf(&tmp_str,",\n"); } char_array_concat((*str_args).strs[arg_index], &tmp_str); } parse_input_virtual_fields(tmp_str, &fields, variables); str_array_append_noinit(tmp_str, &new_args); // identities kondo_identities(&tmp_str); arg_index=find_str_arg("identities", *str_args); if(arg_index>=0){ if(tmp_str.length>0){ char_array_snprintf(&tmp_str,",\n"); } char_array_concat((*str_args).strs[arg_index], &tmp_str); } parse_input_identities(tmp_str, &fields, variables); str_array_append_noinit(tmp_str, &new_args); // groups kondo_groups(&tmp_str, box_count); str_array_append_noinit(tmp_str, &new_args); // propagator arg_index=find_str_arg("propagator", *str_args); if(arg_index>=0){ kondo_propagator((*str_args).strs[arg_index], &tmp_str); str_array_append_noinit(tmp_str, &new_args); } // input polynomial arg_index=find_str_arg("input_polynomial", *str_args); if(arg_index>=0){ kondo_input_polynomial((*str_args).strs[arg_index], &tmp_str, fields, box_count); str_array_append_noinit(tmp_str, &new_args); } // id table arg_index=find_str_arg("id_table", *str_args); if(arg_index>=0){ kondo_idtable((*str_args).strs[arg_index], &tmp_str, fields); str_array_append_noinit(tmp_str, &new_args); } // copy remaining entries for(i=0;i<(*str_args).length;i++){ get_str_arg_title((*str_args).strs[i], &title); if(str_cmp(title.str, "virtual_fields")==0 &&\ str_cmp(title.str, "identities")==0 &&\ str_cmp(title.str, "propagator")==0 &&\ str_cmp(title.str, "input_polynomial")==0 &&\ str_cmp(title.str, "id_table")==0 ){ char_array_cpy((*str_args).strs[i], &tmp_str); str_array_append_noinit(tmp_str, &new_args); } free_Char_Array(title); } free_Fields_Table(fields); free_Variables(variables); free_Str_Array(*str_args); *str_args=new_args; return(0); } // generate the Kondo fields table int kondo_fields_table(int box_count, Char_Array* str_fields, Fields_Table* fields){ int i,j; init_Char_Array(str_fields,STR_SIZE); char_array_snprintf(str_fields, "#!fields\n"); // external fields char_array_append_str("x:",str_fields); for(i=0;i=0 && offset[1]>=0 && index[0]>=0 && index[1]>=0){ // write indices and num for(i=0;i0){ // write num polynomial_multiply_scalar(tmp_poly, tmp_num); // replace factor for(i=0;i0){ for(i=0;i0){ for(i=0;i': if(mode==PP_MONOMIAL_MODE){ // resolve scalar product kondo_resolve_scalar_prod(buffer, &scalar_prod_poly, fields); // 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); mode=PP_NULL_MODE; } break; // characters to ignore case ' ':break; case '&':break; case '\n':break; // comments case '#': comment=1; break; default: if(mode!=PP_NULL_MODE){ // write to buffer buffer_ptr=str_addchar(buffer_ptr,*polynomial_ptr); } break; } } } // last term if(tmp_poly.length>0){ polynomial_multiply_scalar(tmp_poly,tmp_num); for(i=0;i=0){ index=*ptr-'0'; } else{ dim=*ptr-'0'; } } } // turn B3 into B2 and B4 into B1 if(offset==KONDO_B_OFFSET){ switch(index){ case 3: index=2; break; case 4: index=1; break; } } // 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); int_array_append(10*(dim+10*offset), &monomial); polynomial_append_noinit(monomial, factor, number_one(), output); } // psi's else{ // construct spin indices for(i=0;i0){ init_Int_Array(&monomial,1); init_Int_Array(&factor,1); int_array_append(10*(i+10*offset)+index, &monomial); polynomial_append_noinit(monomial, factor, number_one(), psi+i); } } // multiply by Pauli matrices Pauli_matrix(dim+1,&pauli_mat); for(a=0;a=0){ kondo_polynomial_vector(offset, index, &poly_vect1, fields); operation=K_VECT_PROD; } break; // index default: // char to int index=*ptr-'0'; } } // final scalar product if(operation==K_SCALAR_PROD){ if(offset>=0){ kondo_polynomial_vector(offset, index, &poly_vect2, fields); kondo_polynomial_scalar_product(poly_vect1, poly_vect2, output, fields); } } // free memory for(i=0;i0){ init_Int_Array(&monomial,1); init_Int_Array(&factor,1); int_array_append(10*(i+10*offset)+index, &monomial); polynomial_append_noinit(monomial, factor, number_one(), psi+i); } } // multiply by Pauli matrices for(i=0;i=10 || *ptr-'0'<0) && (*ptr!='-')){ break; } } if(*ptr=='\0'){ sscanf(str,"%d",&index); return(index); } for(ptr=str;*ptr!='\0';ptr++){ switch(*ptr){ case 'A': offset=KONDO_A_OFFSET; break; case 'a': offset=KONDO_A_OFFSET; break; case 'B': offset=KONDO_B_OFFSET; break; case 'b': offset=KONDO_B_OFFSET; break; 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){ index=*ptr-'0'; } else{ dim=*ptr-'0'; } } } if(offset==-1){ return(-1); } // no virtual field for h or t if(offset==KONDO_H_OFFSET || offset==KONDO_T_OFFSET){ return(10*(10*offset+dim)); } else{ return(100*(10*offset+dim)+index); } }