diff options
Diffstat (limited to 'src/flow_mpfr.c')
-rw-r--r-- | src/flow_mpfr.c | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/src/flow_mpfr.c b/src/flow_mpfr.c new file mode 100644 index 0000000..e03c130 --- /dev/null +++ b/src/flow_mpfr.c @@ -0,0 +1,128 @@ +/* +Copyright 2015 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_mpfr.h" + +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +// define MPFR_USE_VA_LIST to enable the use of mpfr_inits and mpfr_clears +#define MPFR_USE_VA_LIST +// define MPFR_USE_FILE to enable the use of mpfr_printf +#define MPFR_USE_FILE +#include <mpfr.h> +#include "tools.h" +#include "math.h" +#include "definitions.cpp" +#include "number.h" +#include "array.h" +#include "coefficient.h" +#include "flow.h" +#include "rcc_mpfr.h" + + + +// compute flow numerically +int numerical_flow_mpfr(Grouped_Polynomial flow_equation, RCC_mpfr init, Labels labels, int niter, int display_mode){ + // running coupling contants + RCC_mpfr rccs=init; + int i,j; + + 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 + printf("%5d ",0); + for(j=0;j<rccs.length;j++){ + mpfr_printf("% 14.7Re ",rccs.values[j]); + } + printf("\n"); + } + + for(i=0;i<niter;i++){ + // compute a single step + step_flow_mpfr(&rccs, flow_equation); + // convert ls to alphas + if(display_mode==DISPLAY_NUMERICAL){ + // print the result + printf("%5d ",i+1); + for(j=0;j<rccs.length;j++){ + mpfr_printf("% 14.7Re ",rccs.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){ + RCC_mpfr_print(rccs); + } + + return(0); +} + +// single step in the flow +int step_flow_mpfr(RCC_mpfr* rccs, Grouped_Polynomial flow_equation){ + int i; + mpfr_t* res; + + // security: this function assumes that the length of the rcc and the flow_equation are the same + if((*rccs).length!=flow_equation.length){ + fprintf(stderr,"error: mismatch in the size of the flow equation and the rccs"); + exit(-1); + } + + res=calloc((*rccs).length,sizeof(mpfr_t)); + + // compute the constants first + for(i=0;i<flow_equation.length;i++){ + if(flow_equation.indices[i]<0){ + evalcoef_mpfr(*rccs, flow_equation.coefs[i], res[i]); + mpfr_set((*rccs).values[i], res[i], MPFR_RNDN); + } + } + + // for each equation + for(i=0;i<flow_equation.length;i++){ + if(flow_equation.indices[i]>=0){ + evalcoef_mpfr(*rccs, flow_equation.coefs[i], res[i]); + } + } + + // set new rccs + for(i=0;i<flow_equation.length;i++){ + mpfr_set((*rccs).values[i], res[i], MPFR_RNDN); + mpfr_clear(res[i]); + } + + // free memory + free(res); + return(0); +} |