The update to version 1.5 is rather substantial, and introduces some minor backward-incompatibilities: * The header "#!symbols" has been replaced by "#!virtual_fields" * Multiplying polynomials using the '*' symbol is no longer supported (or, rather, the symbolic capabilities of meankondo were enhanced, and the syntax has been changed). * 'meantools exp' has been removed (its functionality is now handled by other means) * 'meantoolds derive' has been replaced by 'meantools differentiate' * The symbolic capabilities were enhanced: polynomials can now be multiplied, added, exponentiated, and their logarithms can be taken directly in the configuration file. * The flow equation can now be processed after being computed using the various "#!postprocess_*" entries. * Deprecated kondo_preprocess. * Compute the mean using an LU decomposition if possible. * More detailed checks for syntax errors in configuration file. * Check that different '#!group' entries are indeed uncorrelated. * New flags in meankondo: '-p' and '-A'. * New tool: meantools expand. * Improve conversion to LaTeX using meantools-convert * Assign terms randomly to different threads. * Multiple bug fixes
209 lines
4.8 KiB
C
209 lines
4.8 KiB
C
/*
|
|
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 "flow.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "tools.h"
|
|
#include "math.h"
|
|
#include "definitions.cpp"
|
|
#include "number.h"
|
|
#include "array.h"
|
|
#include "coefficient.h"
|
|
#include "rcc.h"
|
|
#include "grouped_polynomial.h"
|
|
|
|
|
|
// compute flow numerically, no exponentials
|
|
int numerical_flow(Grouped_Polynomial flow_equation, RCC init, Grouped_Polynomial postprocess_flow_equation, Labels labels, int niter, int display_mode){
|
|
// running coupling contants
|
|
RCC rccs=init;
|
|
// for printing
|
|
RCC rcc_print;
|
|
int i,j;
|
|
|
|
// init printing rcc
|
|
init_RCC(&rcc_print, rccs.length);
|
|
|
|
if(display_mode==DISPLAY_NUMERICAL){
|
|
// print labels
|
|
printf("%5s ","n");
|
|
for(j=0;j<rccs.length;j++){
|
|
print_label(rccs.indices[j], labels);
|
|
}
|
|
printf("\n\n");
|
|
|
|
// print initial values
|
|
RCC_cpy_noinit(rccs,&rcc_print);
|
|
if(postprocess_flow_equation.length>0){
|
|
// ignore constants
|
|
for(j=0;j<rcc_print.length;j++){
|
|
if(rcc_print.indices[j]<0){
|
|
rcc_print.values[j]=1.;
|
|
}
|
|
}
|
|
evaleq(rcc_print, rcc_print, postprocess_flow_equation);
|
|
}
|
|
printf("%5d ",0);
|
|
for(j=0;j<rcc_print.length;j++){
|
|
// use constants from rcc
|
|
if(rcc_print.indices[j]<0){
|
|
printf("% 14.7Le ",rccs.values[j]);
|
|
}
|
|
else{
|
|
printf("% 14.7Le ",rcc_print.values[j]);
|
|
}
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
for(i=0;i<niter;i++){
|
|
// compute a single step
|
|
step_flow(&rccs, flow_equation);
|
|
|
|
// print
|
|
if(postprocess_flow_equation.length>0){
|
|
RCC_cpy_noinit(rccs,&rcc_print);
|
|
// ignore constants
|
|
for(j=0;j<rcc_print.length;j++){
|
|
if(rcc_print.indices[j]<0){
|
|
rcc_print.values[j]=1.;
|
|
}
|
|
}
|
|
evaleq(rcc_print, rcc_print, postprocess_flow_equation);
|
|
}
|
|
else{
|
|
RCC_cpy_noinit(rccs,&rcc_print);
|
|
}
|
|
if(display_mode==DISPLAY_NUMERICAL){
|
|
// print the result
|
|
printf("%5d ",i+1);
|
|
for(j=0;j<rcc_print.length;j++){
|
|
// use constants from rcc
|
|
if(rcc_print.indices[j]<0){
|
|
printf("% 14.7Le ",rccs.values[j]);
|
|
}
|
|
else{
|
|
printf("% 14.7Le ",rcc_print.values[j]);
|
|
}
|
|
}
|
|
printf("\n");
|
|
}
|
|
}
|
|
|
|
if(display_mode==DISPLAY_NUMERICAL){
|
|
// print labels
|
|
printf("\n");
|
|
printf("%5s ","n");
|
|
for(j=0;j<rccs.length;j++){
|
|
print_label(rccs.indices[j], labels);
|
|
}
|
|
printf("\n\n");
|
|
}
|
|
|
|
if(display_mode==DISPLAY_FINAL){
|
|
if(postprocess_flow_equation.length>0){
|
|
RCC_cpy_noinit(rccs,&rcc_print);
|
|
// ignore constants
|
|
for(j=0;j<rcc_print.length;j++){
|
|
if(rcc_print.indices[j]<0){
|
|
rcc_print.values[j]=1.;
|
|
}
|
|
}
|
|
evaleq(rcc_print, rcc_print, postprocess_flow_equation);
|
|
}
|
|
else{
|
|
RCC_cpy_noinit(rccs,&rcc_print);
|
|
}
|
|
RCC_print(rcc_print);
|
|
}
|
|
|
|
free_RCC(rcc_print);
|
|
|
|
return(0);
|
|
}
|
|
|
|
// single step in the flow no exponentials
|
|
int step_flow(RCC* rccs, Grouped_Polynomial flow_equation){
|
|
int i;
|
|
long double* new_rccs=calloc((*rccs).length,sizeof(long double));
|
|
|
|
// initialize vectors to 0
|
|
for(i=0;i<(*rccs).length;i++){
|
|
new_rccs[i]=0.;
|
|
}
|
|
|
|
// compute the constants first
|
|
for(i=0;i<flow_equation.length;i++){
|
|
if(flow_equation.indices[i]<0){
|
|
evalcoef(*rccs, flow_equation.coefs[i], new_rccs+i);
|
|
(*rccs).values[i]=new_rccs[i];
|
|
}
|
|
}
|
|
|
|
// for each equation
|
|
for(i=0;i<flow_equation.length;i++){
|
|
if(flow_equation.indices[i]>=0){
|
|
evalcoef(*rccs, flow_equation.coefs[i], new_rccs+i);
|
|
}
|
|
}
|
|
|
|
// copy results to rccs
|
|
for(i=0;i<(*rccs).length;i++){
|
|
(*rccs).values[i]=new_rccs[i];
|
|
}
|
|
|
|
// free memory
|
|
free(new_rccs);
|
|
return(0);
|
|
}
|
|
|
|
|
|
// print the label of an rcc (takes constants and derivatives into account)
|
|
int print_label(int index, Labels labels){
|
|
int i;
|
|
int nderivs;
|
|
int posin_labels;
|
|
Char_Array label;
|
|
|
|
// constant term
|
|
if(index<0){
|
|
nderivs=-index/DOFFSET;
|
|
for (i=0;i<12-nderivs;i++){
|
|
printf(" ");
|
|
}
|
|
for(i=0;i<nderivs;i++){
|
|
printf("d");
|
|
}
|
|
printf("C%d ",-index-nderivs*DOFFSET);
|
|
}
|
|
else{
|
|
nderivs=index/DOFFSET;
|
|
posin_labels=intlist_find_err(labels.indices, labels.length, index-nderivs*DOFFSET);
|
|
label=labels.labels[posin_labels];
|
|
for (i=0;i<14-label.length-nderivs;i++){
|
|
printf(" ");
|
|
}
|
|
for(i=0;i<nderivs;i++){
|
|
printf("d");
|
|
}
|
|
printf("%s ",char_array_to_str_noinit(labels.labels+posin_labels));
|
|
}
|
|
|
|
return(0);
|
|
}
|